C 中逻辑运算符的优先级

发布于 2024-12-06 07:35:43 字数 588 浏览 4 评论 0原文

可能的重复:
为什么“++x || ++y && ++z”先计算“++x”?然而,运算符“&&”高于“||”

如果你查看 C 的优先级表,你会看到 &&优先级高于||。

但是看一下下面的代码:

a=b=c=1;

++a || ++b && ++c;

printf("%d %d %d\n",a,b,c);

它打印出“2 1 1”,这意味着“++a”首先被计算,一旦程序在那里看到一个 TRUE,它就在那里停止,因为另一边是什么|| 的并不重要。

但自从&&优先级高于 ||,难道不应该先评估“++b && ++c”,然后将结果插回“++a || result”吗? (在这种情况下,程序将打印“1 2 2”)。

Possible Duplicate:
why “++x || ++y && ++z” calculate “++x” firstly ? however,Operator “&&” is higher than “||”

If you look at C's precedence table, you'll see that && has higher precedence than ||.

But take a look at the following code:

a=b=c=1;

++a || ++b && ++c;

printf("%d %d %d\n",a,b,c);

It prints out "2 1 1", meaning that the "++a" is evaluated first, and once the program sees a TRUE there it stops right there, because what is on the other side of the || is not important.

But since && has higher precedence than ||, shouldn't "++b && ++c" be evaluated first, and then the result plugged back into "++a || result" ? (in this case the program would print "1 2 2").

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

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

发布评论

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

评论(5

埖埖迣鎅 2024-12-13 07:35:43

试着用括号想象一下:

++a || ++b && ++c;

equals

(++a) || (++b && ++c);

是从左到右计算的。

如果&&和 ||将具有相同的优先级,看起来像

(++a || ++b) && (++c);

Just try to imagine it with parentheses:

++a || ++b && ++c;

equals

(++a) || (++b && ++c);

which is evaluated from left to right.

if && and || would have the same precedence, it would look like

(++a || ++b) && (++c);
过去的过去 2024-12-13 07:35:43

优先级规则仅规定它将像这样进行评估:

++a || (++b && ++c);

现在出现了逻辑运算符的短路行为,这表明您必须从左到右评估项,并在知道结果时停止。右边的部分永远不会被执行。

The precedence rules only say that it will be evaluated like this:

++a || (++b && ++c);

Now comes the short circuiting behavior of the logic operators which says that you have to evaluate terms from left to right and stop when the result is known. The part on the right never gets executed.

吻安 2024-12-13 07:35:43

优先级和求值顺序是完全不同的两件事。对于逻辑运算符表达式,求值始终是从左到右。表达式 ++a || ++b && ++c 被解释为

  1. 计算 ++a
  2. 如果 1 的结果为零,则计算 ++b && ++c

表达式解析++a || (++b && ++c);如果子表达式 ++a++b && 中的一个为真,则整个表达式为真。 ++c 是正确的。

Precedence and order of evaluation are two completely different things. For logical operator expressions, evaluation is always left-to-right. The expression ++a || ++b && ++c is interpreted as

  1. Evaluate ++a
  2. If the result of 1 is zero, evaluate ++b && ++c

The expression is parsed as ++a || (++b && ++c); the whole expression is true if either of the subexpressions ++a or ++b && ++c is true.

却一份温柔 2024-12-13 07:35:43

<代码>&&仅在解析树中具有更高的优先级。但编译器将代码优化为

if( !++a ) {
    ++b && ++c;
}

&& has higher precedence only in parse tree. But compiler optimizes the code as

if( !++a ) {
    ++b && ++c;
}
那请放手 2024-12-13 07:35:43

您的示例 ++a || ++b && ++c++a || 相同(++b && ++c)

Your example ++a || ++b && ++c is the same as ++a || (++b && ++c).

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