众所周知,赋值运算符的关联性是从右到左,但如果我们从右到左但输出为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)
分配的右侧从左到右进行评估。 在步骤中,这是正在发生的事情:
您的代码相当于:
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不是这样的语言。
以上就是c/c++开发分享与C中的赋值运算符的相关性混淆相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/544781.html