For循环不会增加计数器'i'

时间:2012-12-08 09:01:39

标签: c++ loops for-loop counter increment

double n = 1.3243;
for (int i = 0; long(n*10) % 10 != 0; i++, n *= 10) {

}

我已编写此代码以了解数字是否包含小数部分。

在循环结束时,'i'应为4,但由于某种原因,计数器不会增加。

除了您可能不喜欢我的解决方案之外,您有任何建议吗?

2 个答案:

答案 0 :(得分:8)

在循环结束时,i变量不再存在。你在功能范围内声明它。这导致无法在循环外访问它。如果您执行以下操作:

double n = 1.3243;
for (int i = 0; long(n*10) % 10 != 0; i++, n *= 10) {   
}
printf("%d\n", i);

GGC给了我一个loop.cpp:10: error: name lookup of ‘i’ changed for new ISO ‘for’ scoping错误。

以下将解决这个问题(请注意for循环如果为空则不需要花括号):

double n = 1.3243;
int i;
for (i = 0; long(n*10) % 10 != 0; i++, n *= 10);
printf("%d\n", i);

使用GCC 4.2.1,这给了我4

的输出

但是在测试十进制数时,你提出的循环有一个不方便的错误。在他的注释中为src remarked,小数点为零会取消其后面的任何小数。一旦找到零值,循环就会中断,但可能会有更多的小数。根据您正在处理的浮动类型,这可能是一个非常大的问题。

请注意:最常见的解决方案是以下比较:

double n = 1.3243;
if (n == (int)n) {
    // do stuff
}

这修复了src提供的错误:1.01据说有小数,就像它应该的那样。循环解决方案(错误地)为此浮动返回i=0

当您的浮点数没有任何小数部分时,比较n == (int)n将返回true。

作为H2CO3 mentioned,测试浮点数的小数不是100%明确的,因为浮点舍入可能会给你一个与你期望的略有不同的答案。但是它适用于一般情况,所以你必须亲自看看它是否适合你正在解决的问题。

答案 1 :(得分:1)

您的代码运行正常。 i = 0,n = 1.3243 .. i = 1,n = 13.243 .. i = 2,n = 123.43 .. i = 3,n = 1234.3然后如果在for循环之外声明“i”则终止它