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