除法是使用整数运算执行的,这会在返回值被赋予到浮点结果类型之前截断小数部分。 此检查并非总是指示存在 bug,因为有时截断是有意为之的。
在 Visual Studio 2022 中,
lnt-integer-float-division
检查是由 C/C++ 代码样式选项中的“截断除法结果”设置控制的。 有关如何更改此设置的信息,请参阅
配置 Linter
。
在 Visual Studio 2019 中,
lnt-integer-float-division
检查是由 C/C++ 代码样式选项中的“转换为浮点的整数除法”设置控制的。 有关如何更改此设置的信息,请参阅
配置 Linter
。
float divide(int i, int j) {
return i / j; // Flagged: The integer division result is implicitly cast to float.
float half(int i) {
return i / 2; // Flagged: An integer literal is used.
如何解决此问题
Linter 建议的解决方法是将其中一个除法操作数显式强制转换为浮点类型,这样不会使除法结果被截断。 还可以使用浮点文本,而不使用强制转换。
float divide(int i, int j) {
return static_cast<float>(i) / j;
float half(int i) {
return i / 2.0;
如果截断是有意为之的,可以添加显式强制转换来防止出现警告。
float int_divide(int i, int j) {
return static_cast<float>(i / j); // Not flagged because of the explicit cast.
适用于 C++ 的 IntelliSense 代码 Linter 概述