Тип выражения определяется статически во время компиляции.
Таким образом, тип и размер выражения (x == 2) ? f : i
известны во время компиляции и не изменятся во время выполнения, независимо от того, какие значения переменных.
Тип результата троичного оператора в этом случае определяется с использованием обычных арифметических c преобразований ( C99 6.5.15p5 и C99 6.3.1.8p1 ). Тип (x == 2) ? f : i
определяется как float
.
Целое sizeof((x == 2) ? f : i)
вычисляется во время компиляции и равно sizeof(float)
.
Вы можете переместить x == 2
из sizeof
, чтобы он оценивался во время выполнения:
if ((x == 2 ? sizeof(f) : sizeof(i)) == sizeof(float))
Также обратите внимание, что может случиться так, что sizeof(short int) == sizeof(float)
.