C / C ++での文字( 'a')のサイズ


298

CおよびC ++の文字サイズはどれくらいですか?私が知る限り、charのサイズはCとC ++の両方で1バイトです。

C:

#include <stdio.h>
int main()
{
    printf("Size of char : %d\n", sizeof(char));
    return 0;
}

C ++の場合:

#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

なぜsizeof('a')CとC ++で異なる値が返されるのですか?


8
"%|"フォーマットが必要とint引数(またはに促進何かをint)。 sizeofタイプの結果を生成しsize_tます。intキャストを使用するように変換するか、実装でサポートされている場合はを使用します"%zu"
キース・トンプソン、

回答:


348

Cでは、のような文字定数の'a'は実際にはintで、サイズは4(または実装に依存する他の値)です。C ++では、タイプはcharで、サイズは1です。これは、2つの言語間の多くの小さな違いの1つです。


12
C ++標準では、セクション2.13.2 / 1、C 6.4.4.4では、少なくとも私が入手したドキュメントではそれです。

14
+1(ただし、「4のサイズ」は明らかにnthrgeekのプラットフォームに適用されますが、必ずしもすべてのプラットフォームに適用されるわけではありません。)
sbi

28
@nthrgeek:私は両方の標準を引用するのが面倒ですが、C ++標準にはCとの非互換性に特化した付録があります。付録C.1.1の下で、「文字リテラルのタイプがからintに変更されchar、動作を説明しています。 :)
2010年

3
@nthrgeek:§6.4.4.4、パラグラフ10:「整数文字定数の型はintです。シングルバイト実行文字にマップされる単一文字を含む整数文字定数の値は、マップされた表現の数値です整数として解釈される文字。」
スティーブンキャノン

7
@nthrgeek:特定の点について議論があり、他の人がなぜ別の意見を持っているのかを理解したいのでない限り、標準的な参照を求めるべきではありません。全員が同意すれば、それを受け入れるだけです。あなた(開発者)は、このような一般的な答えをすべて自分ですばやく見つけるのに十分なほどインテリジェントである必要があります。
マーティンヨーク

26

Paulが述べたように、それ'a'intがCですが、charがC ++であるからです。

CとC ++の具体的な違いについては、数年前に私が書いたもので説明します。http//david.tribble.com/text/cdiffs.htm


4
好奇心旺盛ですが、C ++ 11とC11の新しい変更を含めるために、その(非常に詳細な)ドキュメントを更新していますか?
Adam Rosenfield、2012

現時点ではない。CおよびC ++に対する私の関心は、過去5年間でかなり衰えてきました。
デビッドRトリブル

3
ええと、私はあなたの仕事を使ってこれを書い、ここであなたはSOにいます。こんな小さな世界!

17

Cでは、文字リテラルのタイプはC ++ではintおよびcharです。これは、C ++では関数のオーバーロードサポートするために必要です。この例を見てください:

void foo(char c)
{
    puts("char");
}
void foo(int i)
{
    puts("int");
}
int main()
{
    foo('i');
    return 0;
}

出力:

char

5

C言語では、文字リテラルはchar型ではありません。Cは文字リテラルを整数と見なします。だから、差がないsizeof('a')とはsizeof(1)

したがって、sizeof文字リテラルは、Cのsizeof integerと同じです。

C ++言語では、文字リテラルはのタイプですcharcppreferenceの発言者:

1)幅の狭い文字リテラルまたは通常の文字リテラル(例:'a'or '\n'または)'\13'。このようなリテラルにはchar、実行文字セットのc-charの表現と等しいタイプと値があります。c-charが実行文字セットの1バイトとして表現できない場合、リテラルの型はintで、実装定義の値です。

したがって、C ++では、文字リテラルは char。したがって、C ++の文字リテラルのサイズは1バイトです。

Alos、あなたのプログラムでは、sizeof演算子に間違ったフォーマット指定子を使用しました。

C11§7.21.6.1(P9):

変換仕様が無効である場合、動作は未定義です。275)引数が対応する変換仕様の正しいタイプでない場合、動作は未定義です。

したがって、の%zu代わりにフォーマット指定子を使用する必要があります%d。そうしないと、Cで未定義の動作になります。


%zu多くのプラットフォームではサポートされていませんが、移植性、使用方法(int)sizeof(char)、およびフォーマットが改善されています%d
chqrlie

文字リテラルの値は、対応するASCIIコードである必要はありません。これは、ソース文字セットと実行文字セット、およびcharタイプがデフォルトで署名されているかどうかに依存します。
chqrlie 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.