Простая причина: Поскольку sizeof
не является функцией! Это оператор, который принимает некоторое выражение справа от него. Синтаксически он ведет себя так же, как оператор return
. Скобки добавляются только программистами для ясности и не нужны в большинстве случаев:
sizeof(foo); //no surprise, take the size of the variable/object
sizeof foo; //same as above, the parentheses are not needed
sizeof(void*); //you cannot pass a type to a function, but you can pass it to the sizeof operator
sizeof void*; //same as above
typedef char arrayType[20]
arrayType* bar; //pointer to an array
sizeof(*bar); //you cannot pass an array to a function, but you can pass it to the sizeof operator
sizeof*bar; //same as above
//compare to the behavior of `return`:
return foo; //no surprise
return(foo); //same as above, any expression may be enclosed in parentheses
Итак, что происходит, когда вы говорите sizeof(5, 5.0)
? Итак, поскольку sizeof
является оператором, круглые скобки не являются вызовом функции , а скорее интерпретируются как круглые скобки в 1*(2 + 3) == 5
. В обоих случаях (
следует за оператором и поэтому не интерпретируется как вызов функции. Таким образом, запятая не разделяет аргументы вызова функции (потому что нет вызова функции), скорее она интерпретируется как оператор запятой. И оператор запятой определен для вычисления обоих его операндов, а затем возвращает значение последнего операнда. Характер оператора sizeof
определяет, как анализируется выражение справа от него.