【问题标题】:Does the following code invoke UB?以下代码是否调用 UB?
【发布时间】:2010-01-15 13:41:37
【问题描述】:

下面的代码会调用 UB 吗?

int main(){
  volatile int i = 0;
  volatile int* p = &i;
  int j = ++i * *p;
}

【问题讨论】:

    标签: c++ undefined-behavior


    【解决方案1】:

    是的 - ++i 或 *p(即 i)可以首先被评估。

    【讨论】:

    • 但无论评估顺序如何,结果都是一样的,对吧?
    • 没有。如果首先计算 ++i,则有 1 * 1。如果首先计算 *p,则有 1 * 0。
    • 糟糕!我怎么可能没有注意到!感谢您的回复!
    • 请记住,这不仅是未指定的,而且是未定义的。它几乎肯定会在我熟悉的所有系统上返回 0 或 1,并继续运行,但这不是语言保证。
    • @David 确实如此。我应该在我的回答中指出这一点。
    【解决方案2】:

    是的,那是 未定义的行为,因为您试图违反第二条规则..

    标准规定

    1) 在前一个序列点和下一个序列点之间,对象的存储值最多只能通过表达式的评估修改一次。

    2) 此外,只能访问先验值以确定要存储的值

    注意* 运算符的操作数的求值顺序是未指定*p 只不过是i

    【讨论】:

    • @Prasoon :编辑别人的帖子只是为了用你最喜欢的缩进样式来格式化他们的代码是不对的。您没有阅读 StackOverflow 指南 - “尊重原作者”吗? (>_
    猜你喜欢
    • 1970-01-01
    • 2020-04-19
    • 1970-01-01
    • 2015-02-16
    • 1970-01-01
    • 2023-02-15
    • 1970-01-01
    • 2013-01-06
    • 1970-01-01
    相关资源
    最近更新 更多