在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個逗號操作符;就像在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
。
實際上,IS *是在談論逗號運算符,但我仍然不明白髮生了什麼。 – John 2011-06-13 14:13:14
有趣。我從來沒有見過2個參數的「sizeof」。它被定義爲一個一元運算符,並且可選地使用'()',這會排除多個參數。 – 2011-06-13 14:16:43
@PeterRowell:沒錯。這裏傳遞給'sizeof'的表達式使用逗號運算符。即'sizeof x',其中'x'是表達式'(0,arr)'。 – 2011-06-13 14:19:01