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

Can someone explain to me how this is evaluated ? What I am most confused about is the ! symbol in front of the 3... how to evaluate 2 > !3 ?

4

4 回答 4

3

!是逻辑不。这意味着它为 0 返回 1 或为任何其他值返回 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
于 2011-07-14T13:08:12.567 回答
2

这是运算符优先级表。由此我们可以推断出你的表达方式

  • !具有最高优先级
  • -接下来是
  • >接下来是
  • !=接下来是
  • &&接下来是
  • ||接下来是

!表示逻辑不!0 == 1!anythingElse == 0

表达式被评估为

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

通常,操作数的求值顺序是未指定的,因此在

2 > !3 

编译器在评估!3之前可以自由评估2

但是,对于 && 和 ||,总是首先评估左侧,以便可以使用短路(&&如果左侧为假 (0),则不评估右侧,||如果左侧为真(任何但是 0),右侧不被评估)。在上面,6永远不会被评估,因为左边||是真的。和

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

6 为真,因此永远不会评估右侧。

于 2011-07-14T13:22:46.897 回答
0

最好使用括号来有自己的顺序。否则,运算符优先级在C 运算符优先级表中说明。

从上面的链接:

  1. !3

  2. 2 > !3

于 2011-07-14T10:30:22.537 回答
0

这 !符号将 0 中的值转换为二进制,因此 2>!3 表示 2>0,这将始终为真,并且 4-1 等于 3 不等于 5||6。5||6 总是给你 1 所以整个命令打印 1

于 2011-07-14T10:35:42.803 回答