c/c++语言开发共享与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) 

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

    您的代码相当于:

     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

      (0)
      上一篇 2021年1月9日
      下一篇 2021年1月9日

      精彩推荐