是否可以在不使用 uint16_t 的情况下将此for循环更短或更优雅?当 i 达到 0xFF 时会出现溢出。
for (uint8_t i = 0; i <= 0xFF; i++)
{
// do something
if (i == 0xFF)
break;
}
答案 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在编译时生成数组。此代码可用于任何整数类型。