web-dev-qa-db-ja.com

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

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

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

280
whacko__Cracko

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

318
anon

Paulが述べたように、これは'a'がCではintであるがC++ではcharであるためです。

私が数年前に書いたもので、CとC++の間のその特定の違いをカバーしています。 http://david.tribble.com/text/cdiffs.htm

25
David R Tribble

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

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

出力:

char
16
Smith

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では未定義の動作です。

5
msc