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

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

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

如果我们通过权利letf,输出如何变为1?

如果我们从右到左,那么(b == 0)应首先评估并给出结果0然后表达式(a == 0)被评估也给出0,最后一个值将为0。

赋值是RTL完成的,但是等式( == )不是。

声明实际上是:

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

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

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

您的代码相当于:

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

请注意,这是用这种方式表达的,因为它是从这个问题合并而来的。 OP问为什么a==b==c等同于目标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->一元 – >后缀 – >主 – >常数,但那不是点)

因此规范明确指出 a==b==c评估方式与a==b && b==c

值得一提的是, 有些语言支持表达式a但C不是这样的语言。