4
#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;
}
4

2 回答 2

12

不,它没有。

在这种情况下,由于运算符在评估第一个操作数(条件)之后立即?:具有一个序列点,并且之后仅评估两个表达式中的一个(第二个或第三个操作数),从而保存了这种情况。您的代码相当于

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

这里没有未定义的行为。

于 2010-02-27T04:57:50.390 回答
4

好吧,它肯定有很多问题。

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

这段代码每次运行都会产生相同的结果,所以不,它不是未定义的。在球场上:

i = 11
k = 7
j = 7

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

于 2010-02-27T05:02:25.900 回答