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

时间:2011-08-05 10:02:56

标签: c

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

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

如果我们通过权利letf ??

,输出将如何变为1

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

3 个答案:

答案 0 :(得分:7)

分配是在RTL完成的,但是相等(==)不是。

声明实际上是:

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

从左到右评估作业的右侧。在步骤中,这就是正在发生的事情:

  1. a == b0
  2. 0 == 01
  3. 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不是这样的语言。