以下のコードスニペットでインクリメント演算子が機能しないのはなぜか疑問に思っています。
int main()
{
int a = 10;
int b = sizeof(a++);
cout<<"a: "<<a<<endl;
cout<<"b: "<<b<<endl;
return 0;
}
出力-
a:10
b:4
sizeof
その引数を評価しません。コードを実行せずに、コンパイル時に引数のサイズを静的に計算します。
sizeofに対する式の型が可変的に変更された配列型でない場合、型はコンパイル時に完全にわかっているため、式は評価されません。int
可変的に変更されたパーツはありません。
C ++(少なくともC ++ 11まで)では、可変的に変更された型はありません(少なくとも、Cの概念とはnew int[a++]
異なり、可変的に変更された配列型を使用していると主張できますが、型は他の部分にエスケープされません特にsizeof
)ではないので、C ++では、sizeofへの式が評価されることはありません。Cでは、可変的に変更された配列型のサイズに影響を与えない場合に式が評価されるかどうかは指定されていません。例えば
int main()
{
int a = 10;
int b = sizeof(int[a++ ? 1 : 1]);
cout<<"a: "<<a<<endl;
cout<<"b: "<<b<<endl;
return 0;
}
C(C99以降)では、これはに対して出力11
される場合がありますが、コンパイラが評価を省略できるかどうかによっては、a
も出力される場合があり、sizeofはコンパイル時に計算されると推測されます。10
a++
int[10]
脚注:可変的に変更された配列型は、VLA(可変長配列)型とも呼ばれます。要するに、可変的に変更されたタイプは、VLAタイプまたはそれに依存するタイプのいずれかであるタイプです。たとえばint(*)[a++]
。
演算子のオペランドsizeof
は未使用であり、評価されません。これは標準的な動作です。
sizeofはCの関数ではありません。
その引数は実際には評価されません。その型のみが評価され、これはコンパイル時に行われます。あなたのコードでは、割り当ては(あなたのアーキテクチャでは)以下と同等です:
int b = 4
未評価のコンテキストでは、タイプのみが重要です。関数を呼び出すときにも同じことが起こります。
void f();
sizeof(f()); // f not called