以一种方式执行加法并以其他方式获得正确输出时会溢出,但为什么呢? [重复]

问题描述 投票:0回答:1

我正在编写一个代码,其中有一行 a、b、c、d 是整数,

int a, b, c, d;
long long sum = a + b + c + d;

我收到溢出错误,但在参考答案并修改总和如下答案后,我没有遇到任何问题:

long long sum = a;
sum += b;
sum += c;
sum += d;

对于这一行,我得到了正确的结果。但是为什么我无法理解其中的区别?

c++ sum overflow
1个回答
3
投票

在第一种情况下,表达式:

a + b + c + d

仅包含

int
,因此不进行任何转换,计算在
int
内完成(可能会溢出)。
结果用于初始化
long long
的事实并不相关,因为无论后面的初始化如何,都会对表达式进行求值(如果它是赋值而不是初始化,则同样适用)。
sum
初始化时仅转换结果。

在第二种情况下,行如下:

sum += b;

实际上是:

sum = sum + b;

并且

sum + b
是同时包含
int
long long
的表达式。
因此,为了评估它,
b
被转换为
long long
,并且第一种情况下的溢出不会发生。

旁注:
在发布的代码中,

a
b
c
d
未初始化。
我假设在你的实际代码中它们是。

© www.soinside.com 2019 - 2024. All rights reserved.