在 C 中,逗号运算符不会产生左值,因此作为左值的数组arr
会衰减为作为右值的指针类型(在这种情况下)。由于左值到右值的转换,所以sizeof(0,arr)
变得等价于。sizeof(char*)
但在 C++ 中,逗号运算符产生一个左值。没有左值到右值的转换。所以 sizeof(0,arr)
保持不变,相当于sizeof(char[100])
.
顺便说一句,sizeof
它不是一个函数,它是一个运算符。因此,以下是完全有效的 C++(和 C,如果您想象printf
而不是cout
):
int a[100], b[200], c[300], d[400];
cout << sizeof(a,b,c,d) << endl;
演示:http ://www.ideone.com/CtEhn
你可能认为我已经传递了 4 个操作数,sizeof
但这是错误的。sizeof
对逗号运算符的结果进行操作。由于有许多逗号运算符,您会看到许多操作数。
4 个操作数和 3 个逗号运算符;就像 in 一样1+2+3+4
,有 3 个运算符,4 个操作数。
以上等价于以下内容(在 C++0x 中有效):
auto & result = (a,b,c,d); //first all comma operators operate on the operands.
cout << sizeof (result) << endl; //sizeof operates on the result
演示:http ://www.ideone.com/07VNf
所以是逗号操作符让你觉得有很多论点。这里逗号是一个运算符,但在函数调用中,逗号不是运算符,它只是参数分隔符。
function(a,b,c,d); //here comma acts a separator, not operator.
所以对运算符结果sizeof(a,b,c,d)
的类型,
进行操作,完全一样,对运算符结果sizeof(1+2+3+4)
的类型+
进行操作。
另请注意,您不能编写sizeof(int, char, short)
,正是因为逗号运算符不能对 类型进行操作。它只对价值起作用。我认为,sizeof
是 C 和 C++ 中唯一可以对类型进行操作的运算符。在 C++ 中,还有一个可以对类型进行操作的运算符。它的名字是typeid
。