2016-10-09 9 views
0

Это использование оператора пост-инкремента запутывает.diffrence в работе оператора post increment с и & или оператором

{int a=0,b=1,c=2,d; 
d=a++||b++||c++ 
printf("%d %d %d %d",a,b,c,d);} 

выход

1,2,2,1

значение c не увеличивается, но если я заменить его && оператора увеличивается. Зачем?

+2

@ Олаф Сэр, я почтительно не согласен. Это не обман, по крайней мере, не тот. –

+0

@SouravGhosh: Возможно, вы правы, я могу пропустить. Не совсем ясно, что означает «и оператор» OP. Ваше редактирование подразумевает логическое «и», и я, как правило, соглашаюсь сейчас, но мы лучше попросили разъяснения от OP в первую очередь (вы до редактирования, я до дубля голосования). Я уверен, что есть еще один дубликат, но мой здесь действительно не так. – Olaf

+0

это логический "и" –

ответ

2

Цитирование C11, глава §6.5.14, (курсив мой )

В отличие от оператора побитового |, то оператор || гарантии влево-вправо оценки; если вычисляется второй операнд , то существует точка последовательности между оценками первого и вторыми операндами. Если первый операнд сравнивается не равным 0, второй операнд не оценивается.

Таким образом, в вашем случае,

d=a++||b++||c++ 

такая же, как

d= ((a++ || b++) || c++)  

Тогда утверждение в первых скобках оценивается, первые a++ (пост-инкремент) вычисляется до 0 (ожидаемый побочный эффект), поэтому оценивается RHS первого ||, b++, производя 1 и результат операции || TRUE, дает 1.

Этот результат, 1, является LHS второго ||. Следовательно, RHS второго || (c++) больше не оценивается, и конечный результат становится TRUE, снова приводя к 1, который хранится в d.

Таким образом, в конце концов,

  • a++ оценивается, становится 1
  • b++ оценивается, становится 2
  • c++ является не оценивали, остается 2
  • результат || сохраняется в d, то есть ИСТИНА, поэтому сохраняет 1.

С другой стороны, для логического элемента И && оператора,

[...] Если первый операнд сравнивает равен 0, второй операнд не вычисляется.

Так, если заменить последний || с &&, то для внешнего оператора, то LHS становится 1 и РИТ оценивает, что делает c++ быть оценены и увеличивается, как побочный эффект.

+1

@Olaf, но в данном случае это не UB. все это разные переменные. –

+0

, но почему это не так, и оператор –

+0

@SanyaPandey: Вы действительно спрашиваете: «Как работают' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' Прочтите описание обоих операторов. Вы обнаружите, что в любой хорошей книге C или в Интернете простым поиском. Обратите внимание, что вам необходимо выполнить хотя бы одно из своих усилий, чтобы найти ответ. – Olaf