众所周知,赋值运算符的关联性是从右到左但是 在给定代码中,如果我们从右向左输出但输出为1,则输出应为零。
main()
{
int a=3,b=2;
a=a==b==0;
printf("%d",a);
}
如果我们通过权利letf ??
,输出将如何变为1如果我们从右到左,那么(b == 0)应首先评估并给出结果0然后表达式(a == 0)被评估也给出0,最后一个值将为0。
答案 0 :(得分:7)
分配是在RTL完成的,但是相等(==
)不是。
声明实际上是:
a = ((a == b) == 0)
从左到右评估作业的右侧。在步骤中,这就是正在发生的事情:
a == b
是0
0 == 0
是1
1
已分配到a
答案 1 :(得分:4)
您的代码相当于:
a = ((a == b) == 0);
答案 2 :(得分:4)
请注意,这是以这种方式表达的,因为它是从this question合并的。 OP询问为什么a==b==c
等同于Objective C中的a==b && b==c
(这是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)的评估如下:
平等表达:
关系表达
equality-expression == relational-expression
equality-expression!= relational-expression
我们的情况是第二个,因为在a == b == c
中读取equality_expression == relational_expression
,其中第一个等式表达式是a == b
。
(现在,实际结果编号遵循一个回到数字文字的方式,相等 - >关系 - >移位 - >添加 - >乘法 - > cast->一元 - >后缀 - > primary->常数,但这不是重点)
所以规范明确指出 a==b==c
值得一提的是some languages支持a==b && b==c
形式的表达式,但C不是这样的语言。