在下面,您可以找到一个box类的C++代码的一部分。当我想计算的音量时
l=1039
b=3749
h=8473
我要33004122803。不幸的是,我不明白为什么只有第一个实现(CalculateVolume1(给出了正确的答案。
另外两个计算结果为-135615565。有人能帮我理解为什么会这样吗?
class Box{
private:
int l,b,h;
public:
//works
long long CalculateVolume1() { return (long long) l*b*h;}
// does not work
long long CalculateVolume2() { return long long v = l*b*h;}
//does not work
long long CalculateVolume3()
{
long long v = long long (l)* long long(b)* long long (h);
return v;
}
};
在第一个(long long) l*b*h
中,强制转换应用于l
,就像它被写入((long long)l)*b*h
一样。因此l
被转换为long long
。由于乘法运算中的一个因子是long long
,因此其他两个因子被提升为long long
,并且乘法运算的结果是正确的。
"固定";第二个和第三个中的语法错误
long long v = l*b*h;
这里,所有三个因子的类型都是int
,因此在int
s上进行乘法运算,结果溢出。
long long v = (long long)l*(long long)b*(long long)h;
这与第一个基本相同:这三个因子都被提升为long long
,这一次是通过对这三个因素进行显式强制转换,因此使用long long
算法计算结果,结果符合。
编写的第二个问题是不能在return
语句中定义变量。所以
return long long v = l; // illegal
应该是:
long long v = l;
return v;
第三个问题是,函数样式转换必须有一个单词的名称:
long long v = int(l); // okay, but pointless
long long v = long long(l); // error, invalid name
可能是:
typedef long long my_type;
long long v = my_type(l); // okay