-4

Is it legal to have the following for loops in c and c++:

for(double d=2.0; d<3.1; d+=0.1)
4

8 回答 8

8

它是 C99 和 C++ 的合法语法。只要d在循环内部没有被不当摆弄,它就是确定性的(应该结束)。

尽管循环确实会终止,但尚不清楚究竟会发生多少次循环迭代。在第 12 次迭代中,理论上, 的值d将增加到 ,3.1但由于舍入,它可能是3.099999..(或类似的东西)或可能是(或类似的东西)。3.1000...01因此,循环是否会进行 11 次或 12 次迭代尚不清楚。您不想依赖浮点中的精确匹配。

于 2013-09-18T14:12:16.797 回答
3

您还可以拥有以下

for(char c='a'; c<'A'; c+=1)
 printf("%c", c);
于 2013-09-18T14:11:48.697 回答
1

就语言而言,for循环中没有“索引变量”。只要它们是合法的表达式,只有 3 个表达式可以是您想要的任何内容。

你也可以说,for循环的索引变量只是一个约定,人类的概念。所以您需要问,索引变量(无论您选择如何定义该术语)可以是双精度类型吗?如果您将它用作 C 数组索引,那么我会说“不”,即使隐式转换可以编译此类代码。

但是,根据某些约定使用循环是个好主意。for在我看来,您的问题代码很好地使用了for循环,除了结束条件应该d < (3.1 - 0.00001)允许舍入错误。此调整的确切值和方向取决于循环细节,程序员需要非常小心才能正确(并对其进行测试)。

使用双变量的其他一些代码可能会更好地使用while循环编写,例如递增/递减是否更复杂或有条件。请注意,同样的舍入误差问题也适用。

于 2013-09-18T14:22:38.847 回答
1

是的,是的,没有任何限制。在 C++ 中,使用迭代器创建 for 循环也很常见。

于 2013-09-18T14:11:23.523 回答
1

这在 C 和 C++ 中是合法的,但除非您了解浮点并正确使用它,否则可能不会有您期望的行为。

舍入可能会导致 的值d与所需的端点略有不同,因此循环可能会根据情况多或少地执行一次迭代。(特别是,3.1 和 .1 都不能以最常用的浮点格式精确表示。源文本3.1.1被转换为近似值。)

通常有更好的方法来编写使用一系列浮点值的循环,例如使用整数进行循环控制并在每次迭代中从整数计算浮点值。(或者,您可以使用浮点对象进行循环控制,但请注意仅对循环表达式使用整数值。)

于 2013-09-18T14:15:07.243 回答
0

在 c++ (Microsoft VC++) 中,这很好。

但是,在 c 中,我认为您需要事先声明变量 d,即在函数的开头。

于 2013-09-18T14:12:44.720 回答
0
for(double d=2.0; d<3.1; d+=0.1)

是 C99 和 C++ 中的有效语法,但标识符的范围d仅限于此循环。同样,一旦执行循环,d就不再退出。

于 2013-09-18T14:14:18.330 回答
0

似乎在c中是合法的!您还可以在循环外声明变量 d。

于 2013-09-18T14:18:38.363 回答