【问题标题】:C Relational Operator OutputC 关系运算符输出
【发布时间】:2015-12-27 19:11:41
【问题描述】:
#include <stdio.h>
void main()
{
    int x = 1, y = 0, z = 5;
    int a = x && y || z++;
    printf("%d", z);
}

这将产生输出为 6 而

#include <stdio.h>
void main()
{
    int x = 1, y = 0, z = 5;
    int a = x && y && z++;
    printf("%d", z);
}

这将产生答案为 5。为什么?有人请解释一下。

【问题讨论】:

  • 您期待什么以及为什么?

标签: c logical-operators or-operator and-operator


【解决方案1】:

这是由于Short Circuit mechanism

这意味着当逻辑运算符的结果已经确定时,表达式的其余部分根本不会被计算,包括潜在的副作用。

第一个代码片段的行为如下:

int a = (1 && 0) /* result pending... */ || z++;

第二个:

int a = (1 && 0) /* result determined */;

发生这种情况是因为如果左侧表达式为假,则逻辑与的值已知为假。

【讨论】:

    【解决方案2】:

    正如您可能知道的那样,两段代码之间的区别在于,第一段计算 z++,而另一段则没有。

    第二个代码不计算 z++ 的原因是它前面的表达式计算为 false,所以 &amp;&amp; 链“短路”了最后一项的计算。

    另一方面,运算符|| 只会在左侧为true 时短路。

    【讨论】:

      【解决方案3】:

      对于初学者,不带参数的函数 main 应声明为

      int main( void )
      

      在第一个程序中,初始化表达式可以表示为

      int a = ( x && y ) || ( z++ );
      

      根据 C 标准(6.5.14 逻辑或运算符)

      1. ...如果第一个操作数比较不等于0,则第二个操作数不 评估。

      表达式的第一个oe和( x &amp;&amp; y )等于0,因为y被0初始化

      int x = 1, y = 0, z = 5;
      

      所以第二个操作数( z++ ) 被求值。

      结果 z 将等于 6。

      在第二个程序中,初始化表达式可以用与第一个程序相同的方式表示

      int a = ( x && y ) && ( z++ );
      

      根据 C 标准(6.5.13 逻辑与运算符)

      1. ...如果第一个操作数比较等于0,则第二个操作数不 评估。

      和之前一样,表达式的第一个操作数 ( x &amp;&amp; y ) 等于 tp 0,根据引用,第二个操作数 ( z++ ) 不会被计算。

      结果 z 将和以前一样等于 5。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-30
        • 1970-01-01
        • 2017-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-05
        相关资源
        最近更新 更多