c++ - For 循环不增加计数器 'i'

标签 c++ loops for-loop counter increment

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

}

我编写这段代码是为了了解数字是否有小数部分。

在循环结束时,'i' 应该是 4,但由于某些原因计数器没有增加。

除了您可能不喜欢我的解决方案,您还有什么建议吗?

最佳答案

在循环结束时,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在他的评论中,小数点后的零抵消了它后面的任何小数点。一旦找到零值,循环就会简单地中断,但后面可能会有更多的小数。根据您要处理的 float 类型,这可能是个大问题。

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

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

这修复了 src 出现的错误:1.01 据说有小数,这是应该的。循环解决方案(错误地)返回此 float 的 i=0

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

作为H2CO3 mentioned ,测试 float 的小数不是 100% 确定的,因为浮点舍入可能会给你一个与你预期的略有不同的答案。不过,它适用于一般情况,因此您必须自己看看它是否适合您要解决的问题。

关于c++ - For 循环不增加计数器 'i',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13776015/

相关文章:

javascript - 将 object.keys 复制到新对象

c++ - 如何有效地将 vector 重复到cuda中的矩阵?

c++ - std::remove_if 中的谓词错误

c++ - 编写 std::vector 与普通数组的线程安全

javascript - for 数组对象的循环函数只找到一个

java - 在java中使用for循环时变量的范围 - eclipse/编译器错误?

c++ - 读取二进制文件并打印其内容(Web 服务器)

java - 跳过 While 条件的 Java Do/While 循环

结合for循环和if语句的Pythonic方式

c++ - 在没有任何干预的情况下继续运行程序,直到它被要求退出