以下代码是否会引发未定义行为?

6
以下代码会导致未定义行为(UB)吗?
int main(){
  volatile int i = 0;
  volatile int* p = &i;
  int j = ++i * *p;
}
2个回答

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

但无论计算顺序如何,结果都将是相同的,对吧? - Red Hyena
1
不。如果先评估++i,你会得到1 * 1。如果先评估*p,你会得到1 * 0。 - anon
糟糕!我怎么没注意到那个!谢谢你的回复! - Red Hyena
3
请记住,这不仅是未指定的,它是未定义的。在我熟悉的所有系统上,它几乎肯定会返回0或1,并继续执行,但这并不是语言保证。 - David Thornley
1
@David 是的,确实如此。我应该在我的回答中指出这一点。 - anon

6

是的,这是未定义行为,因为您试图违反第二个规则。

标准规定:

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

2)此外,应仅访问先前的值以确定要存储的值

注意:乘法运算符的操作数的计算顺序是未指定的,而*p实际上就是i


2
@Prasoon:编辑他人的帖子只是为了使用您喜欢的缩进样式格式化代码是不正确的。您没有阅读StackOverflow指南-“尊重原始作者”吗?(>_<) - Red Hyena

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接