4

Cでは、次のコード:

#include<stdio.h>
int main()
{
   char c='a';
   printf("%d %d",sizeof(c),sizeof('a'));
   return 0;
}

1結果を生成し、 4? ロジックを説明してください。

また、なぜsizeof(main())結果は次のようになります4が、sizeof(main)結果は1次のようになります。

#include<stdio.h>

int main()
{

   printf("%d %d\n",sizeof(main), sizeof(main()));
   return 0;
}

また、C++ では、なぜsizeof('a')sizeof('av') の結果が 4 になるのに 1 になるのですか?

4

2 に答える 2

8

Cの文字定数int型ですが、 C++ ではそうではありません。C99標準セクションのドラフトから、6.4.4.4 文字定数の段落10には次のように書かれています(強調鉱山):

整数文字定数の型は intです。1 バイト実行文字にマップされる単一の文字を含む整数文字定数の値は、整数として解釈されるマップされた文字の表現の数値です。複数の文字を含む整数文字定数の値 (例: 'ab')[...]

ドラフトC++標準セクション2.14.3 文字リテラルの段落1から(強調鉱山):

[...]実行文字セットで表現可能な単一の c-char を含む通常の文字リテラルはchar 型です。[...]複数の c-char を含む通常の文字リテラルは複数文字リテラルです。複数文字リテラル、または実行文字セットで表現できない単一の c-char を含む通常の文字リテラルは、条件付きでサポートされ、int 型を持ち、実装定義の値を持ちます。

これavは複数文字リテラルであり、サイズはintになります。

質問の 2 番目の部分については、sizeof(main)有効なコードではありませんが、コンパイラは結果を生成することを選択する場合がありますが、ドラフト C99 標準セクションから、sizeof6.5.3.4 演算子の段落1は次のように述べています。

sizeof 演算子は、関数型または不完全な型を持つ式には適用されません [...]

ドラフト C++ 標準には同様の文言と両方がgccあり、フラグclangを使用すると、次のようなエラーでこのコードについて警告されます。-pedantic

警告: 関数型への「sizeof」の無効な適用 [-pedantic]

はコンパイル時の演算子であるためsizeof(main())sizeof可変長配列の場合を除き、その引数を評価しません。結果は、この場合はintである戻り値の型のサイズです。たとえば、ライブの例を見ることができます:

long double func()
{
    return 1.0 ;
}

sizeof(func())返します16

ノート

お使いのプラットフォームsizeof(int)では4サイズは実装定義です。

注2

の結果sizeofsize_tであるため、より移植性の高いフォーマット指定子は にprintfなります%zu

于 2013-11-11T12:52:53.863 に答える
4

文字定数はints ではありませんchar。は 4 バイトで格納されるので'a'、 に格納する場合よりもc1 に短縮されて になりますchar

技術的には、このサイズのints は実装に依存することに注意してください。

于 2013-11-11T12:53:11.973 に答える