18
#include<stdio.h>
int main()
{
    printf("%d", sizeof('a'));
    return 0;
}

为什么上面的代码在 C 和 C++ 中编译时会产生不同的结果?在 C 中,它在 C++ 中打印 4,这是更可接受的答案,即 1。
当我将 sizeof() 中的“a”替换为在主函数中声明的 char 变量时,两种情况下的结果都是 1!

4

3 回答 3

30

因为,这可能令人震惊,C 和 C++不是同一种语言

C 将字符文字定义为具有 type int,而 C++ 认为它们具有 type char

这是多字符常量可能有用的情况:

const int foo = 'foo';

这将生成一个整数,其值可能是 6713199 或 7303014,具体取决于字节顺序和编译器的心情。换句话说,多字符字符文字不是“可移植的”,你不能依赖于结果值很容易预测。

正如评论者所指出的(谢谢!)这在 C 和 C++ 中都有效,似乎 C++ 使多字符字符文字成为不同的类型。聪明的!

另外,作为我喜欢在讨论主题时提到的一个小提示,请注意 that sizeofis not a function 并且 value of size_tare not int。因此:

printf("the size of a character is %zu\n", sizeof 'a');

或者,如果您的编译器太旧而不支持 C99:

printf("the size of a character is %lu\n", (unsigned long) sizeof 'a');

代表打印您正在调查的尺寸的最简单和最正确的方法。

于 2013-10-29T12:43:24.210 回答
2

在 C 中,'a' 是一个字符常量,它被视为一个整数,因此大小为 4,而在 C++ 中它被视为一个字符。

C/C++ 中可能出现的重复问题Size of character ('a')

于 2013-10-29T12:49:40.527 回答
0

您的示例是 C++ 与 C 不兼容的情况之一。在返回单个字符(如getch)的 C API 中返回,int因为这为 EOF 标记 (-1) 留出了空间。因此,出于这个原因,它将“c”视为一个 int。

C++ 引入了运算符和函数重载,这意味着我们可能想要处理

cout << 'c'

不同于:

cout << 99
于 2013-10-29T12:49:40.803 回答