我有一些这种格式的C ++代码:
void calculate(int a, float b, long c) {
long long result = (a / b) * (1000 / c);
assert(result > 0);
// more code...
}
但是,assert语句失败了。给出a,b和c都是正数的值。然后我认为'结果'由于某种原因最终成为'结果== 0'。这里提供的类型转换的逻辑中是否存在固有的东西导致我的代码失败?
我是C ++的新手,所以答案似乎很明显......
答案 0 :(得分:4)
如果c > 1000
,则由于整数除法,表达式(1000/c)
变为零。这里正在执行整数除法,因为两个操作数都是整数类型。
结果,表达式(a / b) * (1000 / c)
变为零,因此result
的值变为零,从而触发断言。
b > a
会出现同样的情况,原因与上述相同。
如果整数除法不是您想要的,请重写您的表达式:
long long result = long long((float(a) / b) * (1000.0f / c));
这会调用浮点除法而不是整数除法。为了计算结果,a
和c
的值将转换为浮点类型。