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
?
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
?
!是逻辑不。这意味着它为 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
这是运算符优先级表。由此我们可以推断出你的表达方式
!
具有最高优先级-
接下来是>
接下来是!=
接下来是&&
接下来是||
接下来是!
表示逻辑不!0 == 1
,!anythingElse == 0
。
表达式被评估为
((2 > (!3)) && ((4 - 1) != 5)) || 6
通常,操作数的求值顺序是未指定的,因此在
2 > !3
编译器在评估!3
之前可以自由评估2
但是,对于 && 和 ||,总是首先评估左侧,以便可以使用短路(&&
如果左侧为假 (0),则不评估右侧,||
如果左侧为真(任何但是 0),右侧不被评估)。在上面,6
永远不会被评估,因为左边||
是真的。和
6 || ((2 > (!3)) && ((4 - 1) != 5))
6 为真,因此永远不会评估右侧。
这 !符号将 0 中的值转换为二进制,因此 2>!3 表示 2>0,这将始终为真,并且 4-1 等于 3 不等于 5||6。5||6 总是给你 1 所以整个命令打印 1