5

可能重复:
C/C++ 中字符('a')的大小

我是C的初学者,对此感到困惑。

C:我尝试使用“%zu”修饰符在 C 中打印 sizeof('a'),它打印出一个值 4。

C++:在 C++ 中使用 cout 打印 sizeof('a'),而 printf(使用上面的格式)都打印了一个值 1。

我相信正确的值应该是 1,因为 'a' 将被视为一个字符。为什么它在 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 == sizef(int),至少在 gcc (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3 上。请注意,此编译器会为上述程序打印几个警告:

warning: multi-character character constant

基本上,字符文字指定组成 int 的四个字节,从左到右,高位字节在前。缺少的前导字节用 0 填充。所以,在我的机器上,第二组和第三组 printf 语句打印

97
24930
6382179
1633837924
61
6162
616263
61626364

在十六进制输出中,您可以看到文字中四个字符的布局(ASCII 码从左到右):“a”映射到最高字节 0x61)。

最后,第四组打印:

a
b
c
d

即字符文字作为整数被压入堆栈,但 printf 仅将该 int 的最低字节打印为 char。

C++ 的行为方式类似,但单字节字符文字被认为是 char 类型,而不是 int。该程序

#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

因此,单字节字符文字被视为 char,而多字节文字被视为 int。

重要的提示

我在一个 int 有 4 个字节的 32 位 Linux 系统上运行我的测试。看看在其他系统上发生了什么会很有趣,例如在 64 位系统上。

编辑

固定答案(感谢提示):字符文字在 C 中具有 int 类型,它们不会强制转换为 int。

于 2012-05-23T04:51:03.157 回答