我有这个程序
#include <stdio.h>
int main()
{
char arr[100];
printf("%d", (int)sizeof(0,arr));
}
当编译为C文件时打印4,并将100打印为C ++文件。为什么?我正在使用gcc。
答案 0 :(得分:34)
在C中,逗号运算符的右手操作数的结果具有类型和值。在C中,逗号运算符不会产生左值。因此,左值转换的左值导致数组类型衰减为指针类型。所以在C中你得到的是sizeof(char*)
的结果。
在C ++中,逗号表达式的结果是左值。没有这样的转换[如在C中],你得到的是sizeof(arr)
,即100
答案 1 :(得分:3)
sizeof
是运算符而不是函数因此,您正在执行逗号运算符,该运算符返回右操作数作为结果。
在C ++中,这是一个引用,因此它仍然是一个数组,并且具有完整的大小。
在C中,在表达式(带有运算符的任何东西)中,通常将类型array of x
转换为pointer to x
。但是对于两个运营商有一个特定的例外:sizeof
和&
。
因为转换规则的例外,sizeof
首先到达那里是否重要。 (参见C99第6.3.2.1节。†)
你可以看到另一种方式,这里程序在C和C ++中返回相同的东西。
#include <stdio.h>
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运算符或一元&amp;的操作数。运营商,或者是 用于初始化数组的字符串文字,类型为“ type ”的数组的表达式是 转换为类型为''指向 type '的指针的表达式,指向的初始元素 数组对象并不是左值。