奇妙的 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 放在式子的开头。

posted @ 2024-07-19 19:54  David_Mercury  阅读(10)  评论(0编辑  收藏  举报