以下代码是否调用未定义的行为?

时间:2010-02-27 04:52:11

标签: c++ undefined-behavior

#include <iostream>
#include <cmath>

#define max(x,y) (x)>(y)? (x): (y)

int main() {
  int i = 10;
  int j = 5;
  int k = 0;
  k = max(i++,++j);
  std::cout << i << "\t" << j << "\t" << k << std::endl;
}

2 个答案:

答案 0 :(得分:12)

不,它没有。

在这种情况下,?:运算符在计算第一个操作数(条件)之后立即有序列点这一事实可以保存情况,之后只有两个表达式中的一个(第二或第三操作数)被评估。您的代码等同于

...
bool c = i++ > ++j;
k = c ? i++ : ++j;
...

这里没有未定义的行为。

答案 1 :(得分:4)

嗯,肯定有很多问题。

  • max实际上是计算min
  • 由于您使用的是宏
  • ,因此无论选择何种选项,增量运算符都会加倍
  • 使用后缀/前缀增量只会引起混淆,但对问题没有多大影响。

此代码每次运行时都会产生相同的结果,所以不,它不是未定义的。在cout:

i = 11
k = 7
j = 7

这听起来像是一个糟糕的家庭作业问题。 :)