[英]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)
分配的右侧从左到右进行评估。 分步进行,这是发生的事情:
a == b
为0
0 == 0
是1
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.