c - 为什么我= ++我调用未定义的行为?

Qur*_*ous 3 c increment operator-precedence undefined-behavior sequence-points

我理解C使用序列点的概念来识别模糊计算,并且该=运算符不是序列点.但是,我无法看到执行语句时有任何歧义

i = ++i

根据我的理解,这仅仅是评估任何在&i,增加它,并将其存储在同一位置.然而,GCC将其标记为:

[警告]'i'上的操作可能未定义[-Wsequence-point]

我错过了一些关于=功能的方法吗?

编辑:在标记为重复之前,请注意我浏览了有关序列点和未定义行为的其他帖子.他们都没有具体地解决表达式i=++i(注意增量).提到的表达一般i=i++a=b++ + ++b,等等.我对它们中的任何一个都毫无疑问.

Ide*_*Hat 5

你遗漏了一些未定义的行为.未定义的行为只是意味着编译器可以做任何想做的事情.它可以抛出错误,它可以(如GCC所示)显示警告,它可以导致恶魔飞出你的鼻子.主要的是,它不会表现良好,并且在编译器之间不会表现一致,所以不要这样做!

在这种情况下,编译器不必使得在返回语句的rhs之前必须完成运算符的lhs的副作用.这对你来说很有趣,但你不像计算机那样思考.如果需要,它可以计算返回值并将其返回到寄存器中,将其分配给i,然后对实际值执行增量.所以看起来更像

register=i+1;
i=register;
i=i+1;
Run Code Online (Sandbox Code Playgroud)

该标准不保证不会发生这种情况,所以就是不要这样做!

  • 问题不在于什么是UB,问题是*为什么*是UB? (3认同)