【发布时间】:2019-11-29 13:10:32
【问题描述】:
我想知道如何使用如下代码
int result = 0;
int factor = 1;
for (...) {
result = ...
factor *= 10;
}
return result;
如果循环迭代了n 次,则factor 乘以10 正好是n 次。但是,factor 仅在乘以 10 总共 n-1 次后才会使用。如果我们假设factor 除了在循环的最后一次迭代之外永远不会溢出,但可能在循环的最后一次迭代时溢出,那么这样的代码是否可以接受?在这种情况下,factor 的值在溢出发生后将被证明永远不会被使用。
我正在争论是否应该接受这样的代码。可以将乘法放在 if 语句中,而在循环的最后一次迭代可能溢出时不进行乘法运算。缺点是它使代码混乱并添加了一个不必要的分支,需要检查所有先前的循环迭代。我还可以少循环一次循环并在循环之后复制循环体一次,这再次使代码复杂化。
有问题的实际代码用在一个紧凑的内循环中,该循环占用了实时图形应用程序中总 CPU 时间的很大一部分。
【问题讨论】:
-
我投票结束这个问题,因为这个问题应该在codereview.stackexchange.com 而不是这里。
-
@KevinAnderson,不在这里有效,因为示例代码将被修复,而不仅仅是改进。
-
@harold 他们很亲密。
-
@LightnessRaceswithMonica:标准的作者打算并期望针对各种平台和目的的实现将通过有意义地处理对这些平台和目的有用的各种操作来扩展程序员可用的语义,无论是否该标准要求他们这样做,并表示他们不希望贬低不可移植的代码。因此,问题之间的相似性取决于需要支持哪些实现。
-
@supercat 对于实现定义的行为,当然,如果您知道您的工具链有一些可以使用的扩展(并且您不关心可移植性),那很好。对于UB?值得怀疑。