繁体   English   中英

C中赋值运算符的关联性的混淆

[英]Confusion with Associativity of Assignment operator in C

众所周知,赋值运算符的关联性是从右到左,但是在给定的代码中,如果我们从右到左,则输出应为零,但输出为1。

 main()
 {
 int a=3,b=2;
 a=a==b==0;
 printf("%d",a);
 }

如果我们右移到letf,输出将如何变成1?

如果我们从右到左走,则应首先评估(b == 0)并给出结果0,然后对表达式(a == 0)进行评估也得出0,最后a的值将为0。

分配是通过RTL完成的,但不等于( == )。

该语句实际上是:

a = ((a == b) == 0)

分配的右侧从左到右进行评估。 分步进行,这是发生的事情:

  1. a == b0
  2. 0 == 01
  3. 1被分配给a

请注意,这是从此问题中合并而来的。 OP询问为什么a==b==c等于目标C(这是C的严格超集)中的a==b && b==c 我要求将此答案移植,因为它引用了此处其他答案没有的规范。


不,不是,就像(a==b) == c

让我们看一下您的规则的简单反例:

(0 == 0 == 0);// evaluates to 0

然而

(0 == 0) && (0 == 0) // evaluates to 1

逻辑有问题,因为:

(0 == 0 == 0)读取为((0 == 0) == 0) ,类似于1 == 0 ,它为假(0)。


对于有抱负的学生

对此进行一些评估。 编程语言包括语法 ,该语法指定您如何阅读该语言的语句。 Siance Objective-C没有实际的规范,我将使用C规范,因为Objective-c是c的严格超集。

该标准指出, equality expression (6.5.9)的计算如下:

平等表达:

关系表达

相等表达式==关系表达式

相等表达式!=关系表达式

我们的情况是第二种情况,因为在a == b == c被读为equality_expression == relational_expression ,其中第一个等式表达式是a == b

(现在,实际结果的数量可以相当地回到数字的数量上-相等->关系->移位->累加->乘法->广播->一元->后缀->原始->常数,但这不是点)

因此, 规范明确指出a==b==c 作为评估同样a==b && b==c

值得一提的是, 某些语言确实支持a<b<c形式a<b<c表达式,但是C不是这样一种语言。

您的代码等效于:

a = ((a == b) == 0);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM