为什么同一个程序在C和C++中的输出结果不同?

21

可能是重复问题:
在C/C++中字符'a'的大小

以下程序:

#include <stdio.h>

int main()
{
    printf("%d\n", sizeof('\0'));
    printf("%d\n", sizeof(0));
}

使用gcc编译的输出

4
4

使用g++编译

1
4
为什么会发生这种情况?我知道这不是编译器的问题,而是C和C++之间的差异,但原因是什么?
为什么会发生这种情况?我知道这不是编译器的问题,而是C和C++之间的差异,但原因是什么?

25
更像是与语言有关的! - Shahbaz
你一开始为什么要这样做,出于好奇心吗? - temporary_user_name
4个回答

35
在C语言中,字符常量具有int类型,根据标准6.4.4.4(10)的规定,

一个整型字符常量的类型为int。包含单个字符且映射到单字节执行字符的整型字符常量的值是解释映射字符表示为整数的表示形式的数值。

因此,您打印出了两次int的大小。
在C++中,字符常量具有char类型。

12

\0字符字面量在C语言中被视为一个int类型,因此实际上您打印的是sizeof(int)而不是sizeof(char)

ideone 提供相同的结果(CC++)。


1
@Konrad,没错,在C语言中比int小的所有类型都会被视为int。已修复。 - Frédéric Hamidi
不,那也不是完全正确的,只有字符字面量才被视为“int”:http://ideone.com/ZQIPC - Konrad Rudolph
@Konrad,在你的例子中,short测试使用了强制类型转换。当然,没有办法表示一个short字面量,所以即使一个适合short的值从一开始就被解析为int。事实上,有趣的是要知道一个可能的short字面量是否会像char一样被处理... - Frédéric Hamidi
但是你的评论没有涉及字面量,它谈论的是。而且由于C语言除了int之外没有其他整数字面量,如果评论谈论字面量(而不是值),那么这个评论就毫无意义了。 - Konrad Rudolph
@Konrad,啊,我实际上是在谈论字面值(intchar类型的字面值,因为short类型的字面值实际上并不存在),而不是值。虽然我同意我的评论有歧义,但我可能应该找到更好的表达方式。 - Frédéric Hamidi

4
在 C 语言中,字符字面值是整型。在 C++ 中,它们是字符类型。

0

输出已经与编译器相关,因为您使用了错误的格式说明符size_t,应该使用%zu。在size_tint宽的64位系统上,这可能会给您任何一种垃圾。

否则,这肯定是与编译器相关的。您尝试打印大小的两个值在C中都是intchar,在C++中是intchar。因此,在C中,这通常会给您4 48 8,在C++中会给您1 41 8


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