【问题标题】:Unexpected behavior of complicated expression with increments and logical operators [duplicate]具有增量和逻辑运算符的复杂表达式的意外行为[重复]
【发布时间】:2013-09-16 01:15:25
【问题描述】:

我正在阅读一本 C 目标书,其中有一个问题:

#include<stdio.h>
#include<conio.h> 
int main()
{
    int i,j,k;
    i=j=k=1;
    k=++i||++j&&++k;
    printf("%d %d %d",i,j,k);
    return 0;
}

输出是:

2 1 1

在我看来:

  1. k 递增。

  2. j 递增。

  3. i 递增。

  4. k&amp;&amp;j 将会发生。

  5. i|| (k&amp;&amp;j)

所以输出应该是i=2,j=2,k=1。我错过了什么?

【问题讨论】:

    标签: c operators logical-operators


    【解决方案1】:

    表达式k=++i||++j&amp;&amp;++k; 导致未定义的行为。您正在尝试分配给k 两次而没有中间序列点。

    即使分配给不同的变量,您的步骤也会不准确 - 逻辑运算符具有短路行为。

    编辑:OP 说他将表达式更改为a=++i||++j&amp;&amp;++k。我将用括号和一些空格重写它:

    a = ++i || (++j && ++k);
    

    在这种情况下,由于 || 运算符的短路行为,仅计算 ++i

    【讨论】:

    • (另外,如果一本编程书调用了未定义的行为,并且没有说明它是未定义的行为,您可能应该得到另一本书)
    • 如果我们不进行未定义的行为,我的逻辑是错误的。
    • @migrenda,是的,你的逻辑仍然是错误的,即使在这种情况下没有 UB。
    • 我把 k 改成了 a(a=++i||++j&&++k)
    • 输出仍然是 2 1 1
    猜你喜欢
    • 1970-01-01
    • 2011-03-17
    • 2013-04-03
    • 2015-09-20
    • 2015-04-17
    • 1970-01-01
    • 2018-06-15
    • 2013-09-20
    • 2019-09-06
    相关资源
    最近更新 更多