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
の結果sizeof
はsize_tであるため、より移植性の高いフォーマット指定子は にprintf
なります%zu
。