15

次のCプログラム:

#include <stdio.h>

int main(void)
{
    printf("%u %u %u\n",sizeof "",sizeof(""+0),sizeof(char *));
    return 0;
}

1 4 4LinuxでGCCを使用してコンパイルすると出力されますが、1 1 4WindowsでMicrosoft VisualC++を使用してコンパイルすると出力されます。GCCの結果は私が期待するものです。MSVCにバグがあるため、またはsizeof(""+0)定義されていないため、それらは異なりますか?どちらのコンパイラでも、使用する文字列リテラルまたは整数定数に関係なく、動作(つまり、出力される中間値が最初の値と最後の値のどちらに等しいか)は同じです。

ANSI C規格の関連する参照は、6.2.2.1のようです-左辺値と関数指定子:

sizeof演算子のオペランドである場合を除き、「タイプの配列」タイプの左辺値は、配列オブジェクトの初期要素を指し、「タイプへのポインター」タイプの式に変換されます。左辺値。

ただしsizeof(""+0)、配列/文字列リテラルではnotのオペランドであるため、「Except」は適用され+ませんsizeof

4

3 に答える 3

7

"fooabc"は 型char[7]であるためsizeof("fooabc")、 と同じ結果が得られsizeof(char[7])ます。ただし、配列は暗黙的に変換することができます - あなたが引用した部分 - ポインターに (一部の人々はこれを誤って「崩壊」と呼んでいます)、これは算術 ( +) が機能するために必要であるため""+0、型はchar*. また、char ポインターは、配列とは異なるサイズを持つことができます。その点で、MSVC の動作は壊れているようです。

于 2011-02-01T12:29:23.470 に答える
1

MSVCのエラーだと思います。

""+0のアドレス""(これは type で減衰されますchar*) を取り、それに 0 を加算します。その式タイプはchar*.

少し遊んでみましょう: の値は""+0何ですか? との""+1?とのsizeof(""+1)

于 2011-02-01T12:30:53.143 に答える
1

MSVC のバグのようです。どうやら+0、適切な型分析を行う前に、オプティマイザーが を削除しているようです。

于 2011-02-01T12:31:04.780 に答える