В C оператор запятой не выдает lvalue, следовательно, массив arr
, который является lvalue , распадается в тип указателя, который является rvalue (в данном случае). Таким образом, sizeof(0,arr)
становится эквивалентным sizeof(char*)
из-за преобразования lvalue в rvalue .
Но в C ++ оператор запятой выдает lvalue. Нет преобразования lvalue-to-rvalue . Таким образом, 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
.