C和C++中sizeof()运算符的返回值是什么?

18
#include<stdio.h>
int main()
{
    printf("%d", sizeof('a'));
    return 0;
}
为什么在C和C++编译中,上面的代码会产生不同的结果? 在C中,它打印4,而在C++中,则是更可接受的答案,即1。
当我将sizeof()中的'a'替换为在main函数中声明的char变量时,两种情况下的结果都为1!

3
为什么“1”比“4”更可接受? - Paddyd
@Paddyd 因为在C和C++中,sizeof(char)都是1 - Yu Hao
@Paddyd 是因为 char 类型的大小不同!这个差异我之前并不知道,所以 1 看起来很明显。 - mac93
3个回答

30

因为这可能令人震惊,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');

代表了研究所涉及的尺寸打印的最简单和最正确的方式。


C++中也允许多字符字面量。 - Yu Hao
1
C++还具有多字符字面值,类型为“int”,其实现定义的值。 - Mike Seymour
为什么我在使用%zu时会收到“警告:格式中未知的转换类型字符'z'”的警告? - noufal
@noufal 最安全的代码(在Visual Studio中只能运行C89/90)是 printf("%u", (unsigned)(sizeof 'a'));。%d 和(int)也可以使用,因为所有内置类型都有小的正数大小。 - Mike Housky
1
@mjs:它们确实是;但在这种情况下,它是实现定义的(不是未定义或未指定),因此编译器应该记录它所做的事情,并无论心情如何都要这样做。 - Mike Seymour
显示剩余4条评论

2
在C语言中,'a'是一个字符常量,被看作整数,因此得到的大小为4,而在C++中则被视为char类型。
可能有重复的问题,请参考C/C++中字符'a'的大小

0

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

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

cout << 'c'

与之不同:

cout << 99

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接