c – 一个’for’循环,看起来实际上是无限的

我正在调试一些代码,我已经遇到这一行:

for (std::size_t j = M; j <= M; --j)

(写我的老板,谁在度假。)

对我来说看起来很奇怪。

它有什么作用?对我来说,它看起来像一个无限循环。

std :: size_t由C标准保证为无符号类型。如果将无符号类型从0减1,则该标准保证这样做的结果是该类型的最大值。

该回绕值总是大于或等于M1,所以循环终止。

因此,当应用于无符号类型时,j <= M是说“将循环运行到零然后停止”的方便方式。 例如运行j大于你想要的,甚至使用滑块运算符(std :: size_t j = M 1; j – > 0;){存在,虽然需要更多的打字,可以说更清楚。我想有一个缺点,(除了它在第一次检查产生的令人困惑的效果)是,它不能很好地移植到没有无符号类型的语言,如Java。

还要注意,你的老板已经选择“借用”一个可能的值从无符号集:这样发生在这种情况下,设置为std :: numeric_limits< std :: size_t> :: max()不会有正确的行为。事实上,在这种情况下,循环是无限的。 (你是在观察什么?)你应该在代码中插入一个注释,甚至可以在该特定条件上断言。

1 Subject to M not being std :: numeric_limits< std :: size_t> :: max()。

http://stackoverflow.com/questions/41278210/a-for-loop-that-appears-to-be-practically-infinite

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:c – 一个’for’循环,看起来实际上是无限的