6

C ++ ANSI ISO IEC 14882 2003 Annex C.1(668ページ):

変更:条件式、代入式、またはコンマ式の結果は、左辺値である可能性があります
。理論的根拠:C + +はオブジェクト指向言語であり、左辺値に比較的重点を置いています。たとえば、関数は左辺値を返す場合があります。
元の機能への影響:明確に定義された機能のセマンティクスに変更します。左辺値から右辺値への変換に暗黙的に依存する一部のC式では、異なる結果が得られます。例えば、

char arr[100];
sizeof(0, arr)

C++およびCで100を生成しsizeof(char*)ます
。..。

私はちょうど今日これを読んでいて、数ヶ月前に私の友人が問題を提案したことを思い出しました。それは、C ++でコンパイルされた場合は0を返し、Cでコンパイルされた場合は1を返す関数を書くことでした。これは、Cでは構造体が外部スコープにあるという事実を利用しています。したがって、この新しい情報を考慮して、これはMicrosoft Visual Studio 2008で試した上記の問題の別の解決策になると判断しましたが、CまたはC ++コードとしてコンパイルされているかどうかに関係なく、sizeof(0, arr)常に4が生成されます。

1.ISO Cとは何ですか?それは現在のC標準ですか?それだけですか(Cは急速に進化していると聞きました)2。これはMicrosoft C ++のバグですか?

TIA

編集:申し訳ありませんが、出力と混同して編集しました:

4

3 に答える 3

5

ISOCはC標準です。現在のものはC99ですが、C1xはもうすぐです。急速に、あなたが10年かそこらごとに新しい標準を意味するなら、そうです、それは急速に進化しています:-)

ISOC99のセクション6.5.3.4/3は次のように述べています。

タイプchar、unsigned char、signed char(またはそれらの修飾バージョン)を持つオペランドに適用すると、結果は1になります。

配列型のオペランドに適用すると、結果は配列の合計バイト数になります。

于 2010-10-17T12:33:54.813 に答える
1

または、MicrosoftのCはISO Cではなく、他の標準C(存在する場合)です。

Microsoft VisualCは引き続きC89[のみ]をサポートしますが、gcc/clangなどの他のコンパイラも現在の標準であるC99をサポートします。

C99[セクション6.5.17/2]は言う

コンマ演算子の左側のオペランドは、void式として評価されます。評価後にシーケンスポイントがあります。次に、右のオペランドが評価されます。結果にはそのタイプと値があります。95

したがって、の結果はsizeof (0,arr)[sizeof(char*)暗黙的な変換/ポインタ型へのlvalue自動rvalue減衰による]ではありません。100*sizeof(char)

sizeof(arr)100*sizeof(char)から与えただろう6.5.3.4/3

95)コンマ演算子は左辺値を生成しません。


これは、Microsoft Visual Studio 2008で試した上記の問題の別の解決策になると判断しましたが、CまたはC ++コードとしてコンパイルされているかどうかに関係なく、sizeof(0、arr)は常に4になります。

C ++03[ 5.18/1]コンマ演算子

結果のタイプと値は、右のオペランドのタイプと値です。右のオペランドがの場合、結果は左辺値になります。

したがって sizeof(0, arr) = sizeof (arr)、これは=に等しく、100* sizeof(char)=ではありませんsizeof(char*)

そのため、MSVC ++は誤った結果を出します(C ++コードの場合)。

于 2010-10-17T12:35:08.633 に答える
0

配列の場合、sizeofは合計サイズを返します。ポインタとして渡される配列に注意してください。

C99標準:

配列型のオペランドに適用すると、結果は配列内の合計バイト数になります

于 2010-10-17T12:33:59.930 に答える