C ++结束这个8位for循环的最佳方法是什么

时间:2017-12-13 17:26:41

标签: c++ for-loop simplify

是否可以在不使用 uint16_t 的情况下将此for循环更短或更优雅?当 i 达到 0xFF 时会出现溢出。

for (uint8_t i = 0; i <= 0xFF; i++)
{
    // do something
    if (i == 0xFF)
        break;
}

3 个答案:

答案 0 :(得分:7)

为了覆盖整个范围,我们只需要在循环体之后进行测试,所以使用do ... while非常合适:

uint8_t i = 0;
do {
...
} while (i++ < 0xFF);

答案 1 :(得分:3)

由于无符号数的溢出是明确定义的,所以这个循环可以做到:

uint8_t i = 0;
do {
    // use i here
    i++;
} while (i);

i 在第256次迭代时溢出(变为0)而while停止,因为条件为假。

注意:如果你在&lt; 32位平台上,这个技巧是值得的。在&gt; = 32位平台上,很有可能将此技巧转换为使用&gt; = 32位宽计数器的循环。

另一方面,在8位平台上,我认为这是最有效和最小的256次迭代循环。

答案 2 :(得分:1)

不是最短的,但最酷的方法是声明一个包含所有可能值#include <iostream> #include <cstdint> #include <limits> namespace detail { template<typename int_t, int_t cnt, bool not_done, int_t... rest> struct range_impl { static constexpr auto& value = range_impl<int_t, cnt - 1, (cnt - 1) != std::numeric_limits<int_t>::min(), cnt, rest...>::value; }; template<typename int_t, int_t cnt, int_t... rest> struct range_impl<int_t, cnt, false, rest...> { static constexpr int_t value[] = { cnt, rest... }; }; template<typename int_t, int_t cnt, int_t... rest> constexpr int_t range_impl<int_t, cnt, false, rest...>::value[]; } // detail template<typename int_t> struct range : public detail::range_impl<int_t, std::numeric_limits<int_t>::max(), true> {}; int main(int argc, char** argv) { for(uint8_t i: range<uint8_t>::value) { std::cout << (int) i << std::endl; } for(int8_t i: range<int8_t>::value) { std::cout << (int) i << std::endl; } } 的数组并迭代它。

range

{{1}} struct在编译时生成数组。此代码可用于任何整数类型。