Как понять поведение спина к спине операторов? - PullRequest
0 голосов
/ 17 февраля 2019

У меня путаница при использовании AND и OR, хотя это основной вопрос, у меня много путаницы.Я понимаю, что существует методология короткого замыкания, когда используются логические операторы AND и OR.

Assume int a,x=0,y=0;
a). a= 10 && ++x && y++ 

Values a=0,x =1,y=1 [expected ]


 b). a= 10 && ++x || y++
 Values a=1 ,x=1,y=0 [short circuit 
  ,expected ]

 c). a= 10 || ++x || y++
 Values a=1 , x=0, y=0 [short 
  circuit ]

Мои вопросы:

  1. a = 10 && y ++

    Values a =0, x=0(default didn't 
    change ), y=1 [ expected no short 
    circuit y is incremented later and 
    hence a =0 ]
    
  2. Со ссылкой на вопрос 1.

    a = 10 || ++x && y++ 
    

Фактические значения:

 a=1, x=0,y=0

Что я ожидал:

 a = 0, x=0, y=1 

Объяснение: 10 ||++ x (короткое замыкание)

Так что я остаюсь с a = (1 && y ++) => a = 0 (нет короткого замыкания, а y имеет пост-инкремент), следовательно, a = 0, y = 1.

Как я могу понять мой вопрос 2;Мне кажется, я что-то пропустил.

1 Ответ

0 голосов
/ 17 февраля 2019

Обе || и && выполняют оценку слева направо.&& имеет более высокий приоритет, чем || 1 , поэтому a || b && c анализируется как a || (b && c).Помните, что при a || b, если a не равен нулю, то результатом выражения будет 1 независимо от значения b, поэтому b вообще не оценивается.Таким образом, в выражении a || (b && c), если a не равно нулю, то (b && c) не оценивается.

Итак, если a = 10 || x++ && ++y, 10 не равно нулю, то есть результатвыражение будет равно 1 независимо от результата x++ && ++y, поэтому не оцениваются ни x++, ни ++y.


Старшинство only контролирует, как выражения анализируются (какие операторы группируются с какими операндами) - не контролирует порядок, в котором выполняются выражения.
...