奇妙的 c++ 混合运算式
先来看看如下的式子:
a * b + c
当你在 c++ 中运行它时,你很清楚它是先计算 *
再计算 +
的。
那么请再来看看这个式子:
a + b + c
请问它是先执行第一个 +
,还是先执行第二个 +
呢?
这个问题看上去无解,但实际上我们可以解答:
#define ll long long
int a = INT_MAX, b = INT_MAX;
ll c = 0;
ll d = a+b+c;
cout<<d<<endl;
运行上述代码,容易发现输出的结果为 -2
。但正确的答案实际为 4294967294
。为什么会这样呢?
答案很明显,这里发生了整形溢出。为了充分发扬物理中的控制变量思想,我们不妨再试着改动一下:
#define ll long long
int a = INT_MAX, b = INT_MAX;
ll c = 0;
ll d = a+c+b;
cout<<d<<endl;
这时的答案就变成了 4294967294
。
这样我们就成功验证了 c++ 中同级运算的运算顺序为从左到右!
另外,上面的试验还告诉了我们 c++ 运算的另一条性质:c++ 中类型强制转换发生在一个二元运算符的两侧。
所以,以后做那种 long long 和 int 混杂的题目时需要注意:在混合运算的式子中,只有一个 long long 变量可能不够,要注意别处(比如两个大 int 的乘法)的溢出问题;并且,尽量将 long long 放在式子的开头。