5

重複の可能性:
C / C ++での文字のサイズ(「a」)

私はCの初心者ですが、これに戸惑いました。

C:「%zu」修飾子を使用してCでsizeof('a')を出力しようとしましたが、値4が出力されます。

C++:coutを使用してC++でsizeof('a')を出力し、printf(上記の形式を使用)は両方とも値1を出力しました。

'a'はcharと見なされるため、正しい値は1である必要があると思います。なぜCで4を返さないのですか?両方の操作のサイズは、両方の言語で異なりますか?もしそうなら、違いは何ですか、そしてなぜそれは異なる値を返すのですか?どちらの場合もgccコンパイラを使用しました。

4

2 に答える 2

11

Cでは、'a'は文字定数であり、整数として扱われるため、サイズは4になりますが、C++では。として扱われますchar。これはここでの質問の複製です:

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

于 2012-05-23T04:23:34.583 に答える
4

Cでは、文字リテラル(定数)の型はintです。したがって、次のプログラムを検討してください

#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つのステートメントはすべて、リテラルを1文字の定数と見なし、少なくともgcc(Ubuntu 4.4.3-4ubuntu5.1)4.4.3では4 == sizef(int)を出力します。このコンパイラは、上記のプログラムに対していくつかの警告を出力することに注意してください。

warning: multi-character character constant

基本的に、文字リテラルは、intを構成する4バイトを左から右に、上位バイトを最初に指定します。欠落している先頭のバイトは0で埋められます。したがって、私のマシンでは、printfステートメントの2番目と3番目のグループが出力されます。

97
24930
6382179
1633837924
61
6162
616263
61626364

16進出力では、リテラル内の4文字のレイアウト(左から右へのASCIIコード)が表示されます。「a」は最上位バイト0x61にマップされます)。

最後に、4番目のグループは次のように出力します。

a
b
c
d

つまり、文字リテラルは整数としてスタックにプッシュされますが、printfはそのintの最下位バイトのみを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ビットシステムで何が起こるかを見るのは興味深いでしょう。

編集

修正された答え(ヒントに感謝):文字リテラルはCでint型を持ち、intにキャストされません。

于 2012-05-23T04:51:03.157 に答える