2015-03-20 7 views
-1
#include <stdio.h> 
int main() 
{ 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");  
} 

Здесь выражение ((x == 2) ? f : i) вычисляется в i который имеет короткий Int типа .. размер короткого Int = 2, тогда как SizeOf поплавок 4 byts.output должен быть «коротким Int», но im получение выхода «float»SizeOf стоимости условного оператора:

+5

Почему вы кричите? – Biffen

+0

Связанные: http://stackoverflow.com/questions/8535226/return-type-of-ternary-conditional-operator –

ответ

1

sizeof - оператор времени компиляции, поэтому он не может оценить x==2. Он оценивает значение типа тройного выражения, которое в этом случае равно float, путем преобразования в общий тип (второй и третий операнды тройного выражения должны быть одного типа, а int преобразуется в float.)

6

Здесь выражение ((х == 2) F: I) имеет значение I, которое имеет тип короткого Int

Это не так, как обычные арифметические преобразования работа в C. Второй и третий операнды ? : являются сначала преобразованный в общий тип, и этот тип является типом результата выражения. А также этот тип ни в коем случае не будет меньше int, из-за рекламных акций.

Это все описано в разделе 6.3.1 Арифметические операнды из C11 standard, который здесь слишком длинный, чтобы цитировать здесь.

Смежные вопросы