Почему в C функция sizeof () выводит размер самого правого операнда, когда несколько операндов передаются через запятую? - PullRequest
0 голосов
/ 05 апреля 2020

У меня есть следующий код в C:

#include <stdio.h> 

void main() {
    printf("%d %d\n",sizeof(5),sizeof(5,5));   
    printf("%d %d\n",sizeof(5),sizeof(5.0,5)); 
    printf("%d %d\n",sizeof(5),sizeof(5,5.0)); 
}

И я получаю вывод:

4 4

4 4

4 8

Я понимаю, что sizeof (5) вернет мне размер целого числа, а sizeof (5.0) вернет размер двойного, но почему он дает размер самый правый операнд, если передано более одного аргумента через запятую? Почему не первый аргумент или общий размер всех аргументов?

Я компилирую онлайн, используя компилятор OnlineGDB.com для C.

Спасибо за вашу помощь.

Ответы [ 2 ]

3 голосов
/ 06 апреля 2020

Простая причина: Поскольку 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 определяет, как анализируется выражение справа от него.

2 голосов
/ 05 апреля 2020

Потому что ассоциативность оператора запятой слева направо.

Используется только самое правое выражение, а остальные отбрасываются (хотя его побочные эффекты связаны с секвенированием).

Следовательно,

sizeof(5.0,5) эквивалентно sizeof(5)

и

sizeof(5,5.0) эквивалентно sizeof(5.0)

...