c++ - 使用 size_t 初始化循环变量时整数下溢

标签 c++ loops for-loop unsigned size-t

我正在运行下面的代码示例,最初尝试向后打印一个字符数组,其中 count 表示数组中的字符数。每次我运行 for 循环时,i 都没有被初始化为 count - 1 而是被初始化为一个非常大的数字。但是在循环之外,我被正确初始化为 4。我无法解释为什么会这样。

size_t count {5};
size_t i {count - 1UL}; // i is initalized to 4

for(size_t i {count - 1}; i >= 0UL; --i) {
    std::cout << i << std::endl;
} // infinite loop, i is initalized to 18446744073709141874

最佳答案

“无符号”整数没有符号且始终为非负数。如果您在 i = 0 上执行 --i,那么您将获得 std::size_t 的最大值。

改为这样做:

// iterates from (count - 1) to 0
for (std::size_t i = count; i--;)

那么这是如何工作的呢? i--是后缀自减运算符,返回i的先验值。这样,循环条件实际上是将 count, ..., 1 与零进行比较,而在循环中我们得到 count - 1, ..., 0

这个成语的一个更通用的版本有时被称为 --> operator :

// iterates from (high - 1) to low
for (std::size_t i = high; i-- > low;)

关于c++ - 使用 size_t 初始化循环变量时整数下溢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57935909/

相关文章:

java - 使用 for 循环和 if 语句搜索帐户

javascript - 从回调中触发时,函数不会返回任何值

mysql - 在 MySql 中循环,还是替代?

java - 这可以持续做某事吗?

java - 在循环中附加到字符串并保留对附加字符串的访问权限

java - 如何遍历一个集合并将每次的结果加在一起?

c++ - 调试::gdb::src2dst 是什么?

c++ - 无法为Raspberry PI零w交叉编译Qt 5.14.2,因为它是 “requires a C++11 compiler”

c++ - static const char [] 在类线程安全吗?

c++ - MPI,更大的阵列