次のCプログラム:
#include <stdio.h>
int main(void)
{
printf("%u %u %u\n",sizeof "",sizeof(""+0),sizeof(char *));
return 0;
}
1 4 4
LinuxでGCCを使用してコンパイルすると出力されますが、1 1 4
WindowsでMicrosoft VisualC++を使用してコンパイルすると出力されます。GCCの結果は私が期待するものです。MSVCにバグがあるため、またはsizeof(""+0)
定義されていないため、それらは異なりますか?どちらのコンパイラでも、使用する文字列リテラルまたは整数定数に関係なく、動作(つまり、出力される中間値が最初の値と最後の値のどちらに等しいか)は同じです。
ANSI C規格の関連する参照は、6.2.2.1のようです-左辺値と関数指定子:
sizeof演算子のオペランドである場合を除き、「タイプの配列」タイプの左辺値は、配列オブジェクトの初期要素を指し、「タイプへのポインター」タイプの式に変換されます。左辺値。
ただしsizeof(""+0)
、配列/文字列リテラルではnotのオペランドであるため、「Except」は適用され+
ませんsizeof
。