#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;
}
问问题
168 次
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 回答