C 中的运算符优先级

发布于 2024-11-24 14:15:07 字数 171 浏览 2 评论 0原文

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

有人可以向我解释一下这是如何评估的吗?我最困惑的是 3... 如何评估 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 ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

傲鸠 2024-12-01 14:15:07

!逻辑上不是。这意味着它对于 0 返回 1,或者对于任何其他值返回 0。

!0 == 1

!1 == 0

!897489 == 0 

所以在你的例子中 2 > !3 将被评估 2 > 01

对于你的整个表达式,你将有

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

! is the logical not. Meaning it returns 1 for 0 or 0 for any other value.

!0 == 1

!1 == 0

!897489 == 0 

So in your example 2 > !3 will be evaluted 2 > 0 which is 1

For your whole expression you will have

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
分开我的手 2024-12-01 14:15:07

下面是运算符优先级表。由此我们可以推断出在您的表达式中

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

! 表示逻辑不是 !0 == 1, !anythingElse == 0 。

表达式的计算结果为

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

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

2 > !3 

编译器可以在计算 2 之前自由计算 !3

但是,对于&&和 || 时,总是首先评估左侧,以便可以使用短路(使用 && 如果左侧为 false (0),则不评估右侧,使用 < code>|| 如果左侧为 true(除 0 以外的任何值),则不评估右侧)。在上面的代码中,6 永远不会被计算,因为 || 的左侧为 true。 6是

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

正确的,所以右侧永远不会被评估。

Here is a table of operator precedence. From this we can deduce that in your expression

  • ! has the highest precedence
  • - comes next
  • > comes next
  • != comes next
  • && comes next
  • || comes next

! means logical not !0 == 1, !anythingElse == 0.

The expression is evaluated as

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

Generally, the order of evaluation of the operands is unspecified, so in the case of

2 > !3 

the compiler is free to evaluate !3 before evaluating2

However, for && and ||, the left side is always evaluated first so that short circuiting can be used (with && if the left side is false (0), the right side is not evaluated, with || if the left side is true (anything but 0), the right side is not evaluated). In the above, the 6 would never be evaluated because the left side of || is true. With

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

6 is true so the right side will never be evaluated.

另类 2024-12-01 14:15:07

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

the ! sign convert the value in 0 in binary so 2>!3 means 2>0 and this will be always true and 4-1 equals to 3 not equals to 5||6. 5||6 gives you 1 always so the whole command print 1

倾城月光淡如水﹏ 2024-12-01 14:15:07

最好使用括号来确定自己的顺序。否则,C 运算符优先级表中对运算符优先级进行了说明。

从上面的链接:

  1. !3

  2. 2> !3

Its best to use parentheses to have your own order. Otherwise, operator precedence is explained in the C Operator Precedence Table.

From the above link:

  1. !3

  2. 2 > !3

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文