对于使用无符号整数时循环条件停止为0?

gnu*_*nce 11 c unsigned for-loop

我有一个必须从N到0(包括)的循环.我的i变量的类型size_t通常是无符号的.我目前正在使用以下代码:

for (size_t i = N; i != (size_t) -1; --i) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

那是对的吗?有没有更好的方法来处理这种情况?

谢谢,

文森特.

CB *_*ley 7

是的,这是正确的,这是一种非常常见的方法.我不会考虑改变它.

保证无符号整数类型的2^N算术使用模运算(其中N是类型中的值位数),并且很好地定义了溢出时的行为.将结果转换成范围02^N - 1通过添加或减去的倍数2^N(即,模2^N算术).

-1转换为无符号整数类型(其中size_t一个)转换为2^N - 1.对无符号类型--也使用模2^N运算,因此带有值的无符号类型0将递减为2^N - 1.您的循环终止条件是正确的.


Ste*_*non 5

就个人而言,我只会使用不同的循环结构,但对每个循环结构而言:

size_t i = N;
do {
    ...
} while (i --> 0);
Run Code Online (Sandbox Code Playgroud)

(您可以仅用(i--)作循环条件,但永远不要放弃使用-->“运算符”的机会)。

  • +1 用于使用 `-->` 运算符。C 代码旨在被混淆,这很有趣:) (2认同)

mar*_*k4o 5

只是因为for在每次迭代开始时有一个方便的地方进行测试并不意味着你必须使用它.要处理N到0(包括 N),测试应该在最后,至少如果您关心处理最大值.不要让方便你把测试放在错误的地方.

for (size_t i = N;; --i) {
    ...
    if (i == 0) break;
}
Run Code Online (Sandbox Code Playgroud)

一个do-while循环也可以工作但是你还要放弃i作为循环的范围.