首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >a++中的C操作符优先、逻辑与一元&& b++ _~_

a++中的C操作符优先、逻辑与一元&& b++ _~_
EN

Stack Overflow用户
提问于 2018-03-24 11:02:40
回答 1查看 449关注 0票数 0

在折叠代码中,

代码语言:javascript
复制
int a = 1, b = 2, c = 3, d;
d = a++ && b++ || c++;
printf("%d\n", c);

输出为3,或者计算第一个条件,将其视为1,然后不关心其他条件,但在c中,一元运算符比逻辑运算符有更高的优先级,在数学中类似。

代码语言:javascript
复制
2 * 3 + 3 * 4

我们将通过先求乘积,然后求和来计算上面的表达式,为什么c不这样做呢?首先对所有一元运算符进行评估,然后再对逻辑操作进行评估?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-24 11:04:44

请认识到,优先级与评价顺序不同。&&||的特殊行为表明,如果没有必要的话,就根本不会对右侧进行评估。优先级告诉您,如果对其进行评估,将如何对其进行评估。

换句话说,优先级有助于描述如何解析表达式。但它并没有直接说明如何评估它。优先级告诉我们,解析您询问的表达式的方法是:

代码语言:javascript
复制
      ||
      / \
     /   \
    &&   c++
   / \
  /   \
a++    b++

但是,当我们评估这个解析树时,&&||的短路行为告诉我们,如果左边决定了结果,我们就不会从右边去评估任何东西。在这种情况下,由于a++ && b++是真的,所以||操作符知道它的结果是1,所以它根本不会导致计算c++部分。

这也是为什么条件表达式如

代码语言:javascript
复制
if(p != NULL && *p != '\0')

代码语言:javascript
复制
if(n == 0 || sum / n == 0)

是安全的。第一个不会崩溃,不会尝试访问*p,在p为NULL的情况下。如果n为0,则第二个不除以0。

评价的先后顺序很容易给人留下错误的印象。当我们有一种表达方式

代码语言:javascript
复制
1 + 2 * 3

我们总是说“*+更高的优先级意味着乘法首先发生”。但是,如果我们加入一些函数调用,比如:

代码语言:javascript
复制
f() + g() * h()

这三个函数中的哪一个将首先被调用?结果我们不知道。优先并不能告诉我们这一点。编译器可以安排首先调用f(),即使最后需要它的结果。另见this answer

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49463906

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档