for 循环变量不应为浮点型
9.2.6 ID_for_floatCounter
用于控制循环次数的变量称为“循环变量”,这种变量不应采用浮点类型,否则循环的次数难以控制。
由于浮点型变量的不精确性使浮点型变量不适用于控制循环次数,参见 ID_illFloatComparison。
示例:
size_t n = 0;
for (float f = 0.f; f < 1.f; f += 0.001f) { // Non-compliant
....
n++;
}
cout << n << '\n'; // Not 1000
本例按常识应循环 1000 次,然而由于 f 无法精确表示 0.001,导致实际循环次数与预期产生偏差。
可变通地建立整型循环变量与浮点数的关系:
for (size_t n = 0; n < 1000; n++) { // Compliant
float f = n * 0.001f;
....
}
这样循环的次数便与预期相符。
相关
参考
MISRA C 2004 13.4
MISRA C 2012 14.1
MISRA C++ 2008 6-5-1
SEI CERT FLP30-C