在 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。