Приоритет операторов в 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.
Из приведенной выше ссылки:
! 3
2>! 3
! знак преобразует значение в 0 в двоичном виде, поэтому 2>!3 означает 2>0, и это всегда будет истинно, а 4-1 равно 3, а не 5||6. 5||6 дает вам 1 всегда, поэтому вся команда print 1