我正在编写一个代码,其中有一行 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;
对于这一行,我得到了正确的结果。但是为什么我无法理解其中的区别?
在第一种情况下,表达式:
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
未初始化。