在以下代码中调用f(a,a)是未定义的行为?

#include <iostream>

int f(int &m, int &n) {
  m++;
  n++;
  return m + n;
}


int main() {
  int a = 1;
  int b = f(a, a);
}

最佳答案

由于两个变量的修改都是按顺序进行的,因此关于mn的修改没有undefined behaviorm的修改将在n的修改之前进行,因为它们都是完整表达式,并且完整表达式的所有副作用都在下一个完整表达式的副作用之前进行排序。

draft C++ standard的相关部分是1.9程序执行部分,其中说:



和:



另一方面,以下内容:

m++ + n++ ;

是不确定的行为,因为每个子表达式的求值顺序是不确定的。

乔纳森(Jonathan)提出了strict aliasing的问题,但我不明白编译器如何假设nm彼此不混叠,而我对godbolt的实验并未表明任何意外的混叠假设。

注意,完整的表达式是:



通常,;表示完整表达式的结尾。

关于c++ - 引用相同变量的函数参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26431043/

10-11 00:41