Почему это условное выражение имеет размер с плавающей точкой? - PullRequest
0 голосов
/ 23 декабря 2018

Я ожидаю, что вывод будет "short int", но вывод будет "float".

#include <stdio.h>
int main(void)
{
    int x = 1;
    short int i = 2;
    float f = 3;
    if (sizeof((x == 2) ? f : i) == sizeof(float))
        printf("float\n");
    else if (sizeof((x == 2) ? f : i) == sizeof(short int))
        printf("short int\n");
}

Ответы [ 2 ]

0 голосов
/ 23 декабря 2018

Вы ожидаете, что (x == 2) ? f : i будет иметь тип, основанный на значении x.Но это не то, как работает система типа C.Условный оператор является выражением, и все * выражения в C имеют фиксированный тип во время компиляции.Именно этот тип работает с sizeof.Значение выражения будет зависеть от значения x, но тип зависит только от f и i.

В этом случае тип определяется обычными арифметическими преобразованиями,который номинирует float как тип результата, так же, как если бы вы написали f + i, где неудивительно, что результат тоже будет float.


(*) -VLA дает исключения из этого правила, но ваш вопрос не об одном, поэтому он не имеет значения.

0 голосов
/ 23 декабря 2018

Вы просите компилятор вычислить размер (x == 2) ? f : i, и это выражение является float.

Помните, что sizeof является оператором времени компиляции , ичто ?: троичный условный оператор будет иметь в качестве типа нечто, преобразуемое как в случае «then», так и в «else».

Подробнее см. в некоторых Ссылка C и стандарт C11 n1570

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...