i=++i等的未定义的行为规则

Undefined behaviour rules for i = ++i and the like

本文关键字:规则 未定义 ++i      更新时间:2023-10-16

我一直在复习我未定义的行为规则,并阅读了以下内容:

未定义的行为和序列点
为什么f(i=-1,i=-1)是未定义的行为
为什么`x->0 `不是未定义的行为,而`x=x-`是?

而且在C++11中,"i+=++i+1"是否表现出未定义的行为?

最后提出了三个问题:

  1. 形式为i=i++的项的未定义行为规则适用于非积分类型吗?(表达式应该转换为i.operator(i.operator++(i)),因为每个函数调用都是一个序列点,所以如果我正确理解标准的话,它应该定义得很好)
  2. 为什么f(i=-1, i=-1)与"赋值运算的结果是赋值后存储在左操作数中的值;结果是左值"(ref)结合使用时会出现未定义的行为[https://stackoverflow.com/a/4190054/258418]?(我知道I的值后来是未定义的,但如果我正确理解标准,函数调用应该被评估为f(-1, -1)
  3. 哪些类型的表达式在c++11/14/1z中是安全的,只有简单赋值中的预增量/预增量(没有op=

忘记f (i = -1, i = -1)。假设您有两个指针int* pint* q,并且您调用

f (*p = 1, *q = 2)

如果p==q,这是未定义的行为。如果你不希望它是未定义行为,那么在p==q的情况下,你将如何定义行为?(因为如果你不喜欢它是未定义的,你就必须用某种方式来定义它)。此外,你会接受行为的定义吗?这意味着99.999%的代码可能会运行得慢一点,以保存一些明显愚蠢的代码?

然后是

f (*p = -1, *q = -1)

因此,指定了相同的值。如果你希望这是一种定义的行为,但不分配不同的价值观,你究竟如何建议将其纳入一条合理的规则?