【问题标题】:Why are "i = ++i;" and "i = ++i + 2;" undefined behavior? [duplicate]为什么是“i = ++i;”和“i = ++i + 2;”未定义的行为? [复制]
【发布时间】:2020-05-21 11:27:03
【问题描述】:

我发现这篇文章:https://en.cppreference.com/w/cpp/language/eval_order

我不知道为什么 i = ++i;i = ++i + 2; 是未定义的行为。

第一个例子:

int i = 5;

i = ++i;

结果仍然是 6。

如果i = ++i; 被声明为未定义行为,那么i = ++j; 也应该被声明为未定义行为(因为赋值可以在递增之前发生?)。

第二个例子:

int i = 5;

i = ++i + 2;

结果仍然是 8。

如果i = ++i + 2; 被声明为未定义行为,那么i = ++j + 2; 也应该被声明为未定义行为(因为赋值可以在递增和求和之前发生)?

【问题讨论】:

    标签: c undefined-behavior operator-precedence


    【解决方案1】:

    i = ++i;undefined behavior 的原因在于您尝试在没有序列点的同一表达式中同时读取和写入 i

    ++ 运算符执行的递增被视为副作用,= 运算符执行的赋值也是如此。对同一个对象有两个副作用,或者对同一个对象有一个副作用和读取,是导致问题的原因。任何可能的评估顺序都会产生相同的结果并不重要。

    i = ++j; 很好,因为没有对象被多次写入或在没有序列点的同一表达式中读取和写入。

    【讨论】:

    • 你能解释一下什么是序列点吗?
    • @Adam 序列点保证左操作数将在第二个操作数之前被评估 - 例如逗号是序列点。例如:a、b。逗号保证操作数(变量)a 将在操作数 b 之前计算。
    猜你喜欢
    • 1970-01-01
    • 2015-01-09
    • 2017-02-15
    • 1970-01-01
    • 2021-02-28
    • 1970-01-01
    • 2011-10-06
    • 2019-04-26
    相关资源
    最近更新 更多