【问题标题】:Output of the below C Code [duplicate]以下C代码的输出[重复]
【发布时间】:2014-08-30 14:46:58
【问题描述】:
int i=-1,j=-1,k=0,l=2,m;
m=l++||i++ && j++ && k++;
printf("%d %d %d %d %d",i,j,k,l,m);

代码的输出是:-1 -1 0 3 -1
我的问题是为什么 i++ j++k++ 没有被评估,即使 &&|| 具有更高的优先级?

【问题讨论】:

  • “即使”是“因为”。

标签: c logical-operators


【解决方案1】:

思考

m=l++||i++ && j++ && k++;  

作为

m = ( (l++)|| ( (i++ && j++) && (k++) ) );  

您知道&& 具有更高的运算符优先级,因此i++ && j++ && k++ 将被分组为(i++ && j++) && k++,然后是( (i++ && j++) && (k++) )
由于|| 的短路行为,在评估l++(即true)之后,不会评估|| 的右操作数( (i++ && j++) && (k++) )。

【讨论】:

    【解决方案2】:

    Short-circuit evaluation.

    基本上发生的事情是,当 l++=3 不是 0 时,它的计算结果为 True(只有 0 为 False)。因此,|| 之后的表达式的第二部分未评估。

    【讨论】:

    • 是否意味着在短路的情况下,运算符的评估优先级被忽略?
    • 你说l++=3?这是后增量,因此 l++=2 我猜?
    • 上面链接的问题实际上详细介绍了sequence points。在这种情况下,这意味着 || 之前的第一部分在第二部分之前得到完全评估(所以 l 在 || 之前将被视为 3);它优先于运算符优先级。我认为阅读维基百科文章和其他问答链接将有助于进一步解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-08
    • 1970-01-01
    • 2016-12-19
    • 1970-01-01
    相关资源
    最近更新 更多