Приоритет операторов в C

printf ("%d \n", 2 > !3 && 4 - 1 != 5 || 6 ) ;

Может кто-нибудь объяснить мне, как это оценивается? Что меня больше всего смущает, так это ! символ перед 3... как оценить 2 > !3?

4 ответа

! логично нет. Это означает, что он возвращает 1 для 0 или 0 для любого другого значения.

!0 == 1

!1 == 0

!897489 == 0 

Так в вашем примере 2 > !3 будет оцениваться 2 > 0 который 1

Для всего вашего выражения у вас будет

2 > !3 && 4 - 1 != 5 || 6 
2 > 0  && 3 != 5 || 6
1 && 1 || 6                    && is higher precedence || but some compiler will warn (gcc)
1 || 6                         the 6 will not be evaluated (touched) because of short-circuit evaluation
1

Вот таблица приоритетов операторов. Из этого мы можем сделать вывод, что в вашем выражении

  • ! имеет самый высокий приоритет
  • - идет дальше
  • > идет дальше
  • != идет дальше
  • && идет дальше
  • || идет дальше

! значит не логично !0 == 1, !anythingElse == 0,

Выражение оценивается как

((2 > (!3)) && ((4 - 1) != 5)) || 6

Как правило, порядок оценки операндов не определен, поэтому в случае

2 > !3 

компилятор может свободно оценивать !3 перед оценкой2

Однако, для && и ||, левая сторона всегда вычисляется первой, так что можно использовать короткое замыкание (с && если левая сторона ложна (0), правая сторона не оценивается, с || если левая сторона истинна (что угодно, кроме 0), правая сторона не оценивается). В приведенном выше 6 никогда не будет оцениваться, потому что левая сторона || правда. С

6 || ((2 > (!3)) && ((4 - 1) != 5))

6 верно, поэтому правая сторона никогда не будет оценена.

Лучше всего использовать круглые скобки, чтобы иметь свой собственный заказ. В противном случае приоритет оператора объясняется в таблице приоритетов оператора C.

Из приведенной выше ссылки:

  1. ! 3

  2. 2>! 3

! знак преобразует значение в 0 в двоичном виде, поэтому 2>!3 означает 2>0, и это всегда будет истинно, а 4-1 равно 3, а не 5||6. 5||6 дает вам 1 всегда, поэтому вся команда print 1

Другие вопросы по тегам