2014-10-05 2 views
1
int main() 
{ 
int a=10; 
if (a == a--) 
    printf("true1\t\n"); 
a=10; 
if(a == --a) 
{ 
    printf("true2"); 
} 
return 0;} 

как во втором случае, если условие a = 10 и -a равно 9 i.e 10! = 9, и как получается, что второе условие оценивается?Почему выполняется второе условие if, хотя условие даже не выполняется?

+0

Google for ** Неопределенное поведение **; Я уверен, что это дубликат. – pmg

+3

http://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-points –

ответ

7

Значение --a - это предыдущее значение a minus 1.

Кроме того, это выражение имеет побочный эффект при изменении значения a.

Левая часть сравнения - значение a ... но значение a до или после того, как был применен побочный эффект?

Стандарт C не заставляет последовательность проверки значения и применения побочного эффекта; и говорит, что чтение значения переменной и изменение ее значения без промежуточной точки последовательности равно Неопределенное поведение.

В общем, в программе есть точка последовательности в каждом ; (это не так просто); ваше выражение (a == --a) не имеет точек последовательности.

-3

Я считаю, что следующее правило также действует в C, как и в Java: --x имеет более высокий приоритет, чем x--

a=10; 
printf(a--) // should be showing 10; 
a=10; 
printf(--a) //should be showing 9 
+0

Хотя это правда (я не сделал нисходящего), а) не был связан с вопросом, б) он недействителен C. –

-3

В вашей 2, если выражение, - это имеющий высокий приоритет чем == так кажется, что значение первого а уменьшается до 9, а затем переменная a согласуется с самим собой, которая имеет значение 9 (Bcos по обе стороны от оператора == такая же переменная есть). Итак, второе условие оценивается как true.

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