文字リテラル(定数)int型があります。これは、ここでの質問の重複しています。 だから、最初の4つのステートメントのすべてが、少なくともgccの上1つの文字定数と彼らはすべての印刷4 == sizef(int型)、(Ubuntuのようリテラルを検討し、以下のプログラム
#include <stdio.h>
main(int argc, char *argv[])
{
printf("%zu\n", sizeof('a'));
printf("%zu\n", sizeof('ab'));
printf("%zu\n", sizeof('abc'));
printf("%zu\n", sizeof('abcd'));
printf("%u\n", 'a');
printf("%u\n", 'ab');
printf("%u\n", 'abc');
printf("%u\n", 'abcd');
printf("%x\n", 'a');
printf("%x\n", 'ab');
printf("%x\n", 'abc');
printf("%x\n", 'abcd');
printf("%c\n", 'a');
printf("%c\n", 'ab');
printf("%c\n", 'abc');
printf("%c\n", 'abcd');
}
を検討4.4.3- 4ubuntu5.1)4.4.3。
warning: multi-character character constant
基本的には、リテラル文字が最初に左から右へ、高次バイトからint型を構成する4バイト、 を指定します。このコンパイラは、上記のプログラムのためのいくつかの警告を出力すること 注意。 不足している主要なバイトは だから、私のマシン上でのprintf文の第二と第三のグループは、(リテラル で4つの文字のレイアウトを参照してください進数出力で
97
24930
6382179
1633837924
61
6162
616263
61626364
を印刷0で満たされていますASCIIコードは左から右へ): 'a'は 最上位バイト0x61にマップされます。
最後に、第4グループの印刷物:
a
b
c
d
は、すなわち文字リテラルは整数としてスタックにプッシュされているが、printfの のみcharとして、その整数の最下位バイトを印刷します。
C++も同様の動作をしますが、1バイトの文字リテラルは、int型ではなくchar型の とみなされます。プログラム
#include <iostream>
using namespace std;
main(int argc, char *argv[])
{
cout << sizeof('a') << endl;
cout << sizeof('ab') << endl;
cout << sizeof('abc') << endl;
cout << sizeof('abcd') << endl;
cout << 'a' << endl;
cout << 'ab' << endl;
cout << 'abc' << endl;
cout << 'abcd' << endl;
}
はGCCを使用してコンパイルされ、同様の警告が表示されます。その出力はCのそれとは異なる です:
1
4
4
4
a
24930
6382179
1633837924
だから、1バイトの文字リテラルはcharとして扱われ、マルチバイトリテラル はintとして扱われています。
重要な注意
私はintは4つのバイトを持つ、32ビットのLinuxシステム上で私のテストを実行しました。他のシステムで何が起こるかを見ると、興味深いのは でしょう。 64ビットシステムで実行します。
EDIT
固定答え(ヒントのおかげで):文字リテラルは、Cでint型を持っている、彼ら はintにキャストされていません。
CはC++ではないためです。ここでは狙っていない。 CのcharがPythonのcharと異なる場合はおそらく驚かないでしょうが、CがC++のサブセットであると多くの人が考えています。全くそうではありません。以下は良い答えですが、結論としてCとC++は2つの異なる言語です。 – Dan