当我应用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 ”的表达式转换为表达式类型为”指向类型’的指针,指向数组对象的初始元素,而不是左值。