#include<stdio.h>
int main()
{
printf("%d", sizeof('a'));
return 0;
}
为什么在C和C++编译中,上面的代码会产生不同的结果?
在C中,它打印4,而在C++中,则是更可接受的答案,即1。当我将sizeof()中的'a'替换为在main函数中声明的char变量时,两种情况下的结果都为1!
#include<stdio.h>
int main()
{
printf("%d", sizeof('a'));
return 0;
}
为什么在C和C++编译中,上面的代码会产生不同的结果?
在C中,它打印4,而在C++中,则是更可接受的答案,即1。因为这可能令人震惊,C和C++不是同一种语言。
C将字符文字定义为具有类型int
,而C++认为它们具有类型char
。
这是多字符常量可以有用的情况:
const int foo = 'foo';
根据字节顺序和编译器的心情,这将生成一个整数,其值可能为6713199或7303014。换句话说,多字符字符文字不是“可移植”的,您不能指望得到易于预测的结果值。
正如评论者所指出的(感谢!),这在C和C ++中都是有效的,似乎C ++使多字符字符文字成为了不同类型。聪明!
此外,作为一个小技巧,我喜欢在适当的场合提到,注意 sizeof
不是函数,而 size_t
的值也不是 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');
代表了研究所涉及的尺寸打印的最简单和最正确的方式。
%zu
时会收到“警告:格式中未知的转换类型字符'z'”的警告? - noufalprintf("%u", (unsigned)(sizeof 'a'));
。%d 和(int)也可以使用,因为所有内置类型都有小的正数大小。 - Mike Housky你的例子是C++与C不兼容的情况之一。在C中,返回单个字符的API(例如getch
)返回int
,因为这样可以留出EOF标记(-1)的空间。因此,由于这个原因,它将'c'视为int。
C++引入了运算符和函数重载,这意味着我们可能想要处理
cout << 'c'
与之不同:
cout << 99
sizeof(char)
都是1
? - Yu Hao