CとC++の文字サイズは?私の知る限り、charのサイズはCとC++の両方で1バイトです。
#include <stdio.h>
int main()
{
printf("Size of char : %d\n",sizeof(char));
return 0;
}
#include <iostream>
int main()
{
std::cout<<"Size of char : "<<sizeof(char)<<"\n";
return 0;
}
驚くことではありません、それらの両方が出力を与えます:Size of char : 1
これで、文字は'a'
、'b'
、'c'
、'|'
のように表されることがわかりました。したがって、上記のコードを次のように変更しました。
Cの場合:
#include <stdio.h>
int main()
{
char a = 'a';
printf("Size of char : %d\n",sizeof(a));
printf("Size of char : %d\n",sizeof('a'));
return 0;
}
Size of char : 1
Size of char : 4
C++の場合:
#include <iostream>
int main()
{
char a = 'a';
std::cout<<"Size of char : "<<sizeof(a)<<"\n";
std::cout<<"Size of char : "<<sizeof('a')<<"\n";
return 0;
}
Size of char : 1
Size of char : 1
CとC++でsizeof('a')
が異なる値を返すのはなぜですか?
Cでは、'a'
のような文字の型定数は、実際にはサイズ4(またはその他の実装依存の値)のint
です。 C++では、型はサイズが1のchar
です。これは、2つの言語間の小さな違いの1つです。
Paulが述べたように、これは'a'
がCではint
であるがC++ではchar
であるためです。
私が数年前に書いたもので、CとC++の間のその特定の違いをカバーしています。 http://david.tribble.com/text/cdiffs.htm
Cでは、文字リテラルのタイプは、C++ではintおよびcharです。これは、C++では関数のオーバーロードをサポートにする必要があります。この例を参照してください。
void foo(char c)
{
puts("char");
}
void foo(int i)
{
puts("int");
}
int main()
{
foo('i');
return 0;
}
出力:
char
C言語では、文字リテラルはchar
型ではありません。 Cは文字リテラルを整数と見なします。したがって、sizeof('a')
とsizeof(1)
の間に違いはありません。
したがって、sizeof文字リテラルはCのsizeof integerと同じです。
C++言語では、文字リテラルはchar
の型です。 cppreference はこう言う:
1)ナロー文字リテラルまたは通常の文字リテラル。
'a'
または'\n'
または'\13'
。そのようなリテラルは、型char
と、実行文字セット内のc-charの表現に等しい値を持ちます。 c-charが実行文字セット内のシングルバイトとして表現できない場合、リテラルはint型と実装定義値を持ちます。
したがって、C++では文字リテラルはchar
の型です。そのため、C++の文字リテラルのサイズは1バイトです。
Alos、あなたのプログラムでは、sizeof
演算子に間違ったフォーマット指定子を使用しています。
C11§7.21.6.1(P9):
変換指定が無効な場合、動作はundefined.275)いずれかの引数が対応する変換指定の正しい型ではない場合、動作は未定義です
そのため、%zu
の代わりに%d
フォーマット指定子を使用する必要があります。それ以外の場合、Cでは未定義の動作です。