C++ 安全倒数到零"auto"整型

c++ safe counting backwards to zero for "auto" integral type

本文关键字:auto 整型 数到零 安全 倒数 C++      更新时间:2023-10-16

让我们expression是某种类型是积分的,在编译时已知,也许是有符号的,也许是无符号的。按照以下方式倒数到零是否安全(假设表达式的实际值为非负数(?

for(auto i = expression; i!= static_cast<decltype(i)>(-1); --i) {
  //something
}

它是安全的。但在我看来,它很难阅读,安全性/正确性不一定直观(毕竟,你为什么要问其他(。我提议:

for(auto i = expression; i-- > 0;)

(也称为"转到"运算符,格式不同时:i --> 0 (。


编辑:如前所述,这与所讨论的循环的行为并不完全相同。expression 的初始值不会迭代,而是从 expression - 1 开始循环(因此将有恰好expression迭代次数(。

这实际上可能非常危险,因为您允许expression可能是负的。如果发生这种情况,您的代码将开始从 expression 的值计数到负无穷大,这是未定义的行为(没有人知道i达到整数限制后会发生什么(。你基本上有一个没有中断子句的 for 循环。