当我应用sizeof运算符时,为什么会得到不同的结果?

我有这个程序

#include  int main() { char arr[100]; printf("%d", (int)sizeof(0,arr)); } 

这在编译为C文件时打印4,并将100打印为C ++文件。 为什么? 我正在使用gcc。

在C中,逗号运算符的右手操作数的结果具有类型和 。 在C中,逗号运算符不会产生左值。 因此rvalue转换有左值导致数组类型衰减为指针类型。 所以在C中你得到的是sizeof(char*)的结果。

在C ++中,逗号表达式的结果是左值。 没有这样的转换[如在C中],你得到的是sizeof(arr)即100

sizeof是一个运算符而不是一个函数

因此,您正在执行逗号运算符,该运算符返回正确的操作数作为结果。

在C ++中,这是一个引用,所以它仍然是一个数组并且具有完整的大小。

在C中,在表达式(带有运算符的任何东西)中,通常将array of x的类型array of x转换为pointer to x 。 但是两个运营商有一个特殊的例外: sizeof&

因此,如果sizeof首先到达那里,那么这很重要,因为转换规则是例外。 (见C99第6.3.2.1节。

你可以看到另一种方式,这里程序在C和C ++中返回相同的东西。

 #include  int main(void) { char arr[100]; printf("%d\n", (int)sizeof arr); printf("%d\n", (int)sizeof(arr + 0)); return 0; } 

结果在我的Mac上:

 100 8 

†6.3.2.1(3)除非它是sizeof运算符或一元&运算符的操作数,或者是用于初始化数组的字符串文字,否则将类型为”array of type ”的表达式转换为表达式类型为”指向类型’的指针,指向数组对象的初始元素,而不是左值。