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

C++ C++;什么';这是结束8位for循环的最佳方法,c++,for-loop,simplify,C++,For Loop,Simplify,是否可以在不使用uint16\u t的情况下,为更短或更优雅的循环编写此代码?当我到达0xFF时出现溢出 对于(uint8\u t i=0;i要覆盖整个范围,我们只需要在循环体之后进行测试,因此在这里使用do…while非常合适: uint8_t i = 0; do { ... } while (i++ < 0xFF); uint8\u t i=0; 做{ ... }而(i++=32位宽计数器的循环 另一方面,在8位平台上,我认为这是最有效和最小的256次迭代循环。不是最短的,但最酷的方

是否可以在不使用uint16\u t的情况下,为更短或更优雅的循环编写此代码?当我到达0xFF时出现溢出


对于(uint8\u t i=0;i要覆盖整个范围,我们只需要在循环体之后进行测试,因此在这里使用do…while非常合适:

uint8_t i = 0;
do {
...
} while (i++ < 0xFF);
uint8\u t i=0;
做{
...
}而(i++<0xFF);

由于无符号数字的溢出定义良好,此循环可以完成以下操作:

uint8_t i = 0;
do {
    // use i here
    i++;
} while (i);
i在第256次迭代时溢出(变为0),而while停止,因为条件为false

注意:这个技巧只值得一试,如果你在a=32位的平台上,这个技巧很有可能被转换成一个使用>=32位宽计数器的循环


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

不是最短的,但最酷的方法是声明一个包含所有可能值
uint8\t
的数组并对其进行迭代

#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;
    }
}
#包括
#包括
#包括
名称空间详细信息{
模板
结构范围{
静态constexpr auto&value=range\u impl::value;
};
模板
结构范围{
静态constexpr int_t值[]={cnt,rest…};
};
模板
constexpr int_t range_impl::value[];
}//细节
模板
结构范围:public detail::range_impl{};
int main(int argc,字符**argv){
for(uint8\u t i:range::value){

std::cout Yes.删除整个
if
。它是冗余的。
i=0;do{…}while(++i);
删除if会将其更改为无限循环。不,不是!当我是0xFF并且循环结束时,我会得到一个溢出,并且再次处于0。但是说真的,只需使用
int
(不是任何其他类型)。请经常对它的工作原理和原因进行大量的评论!虽然它看起来很奇怪,但这意味着它应该比其他解决方案更好。不过,要了解g++如何将您的代码与我的循环中的代码进行比较,很有意思的是,这两种解决方案的asm都是100%相同的。您可以在您的情况下使用++i来消除这些问题体内循环管理代码。@ChrisUzdavinis::)是的,这就是为什么我在答案中加上注释。即使对于8位目标,它们也可以用好的编译器编译成相同的asm。基本上,我们的解决方案是一样的。我刚刚添加了我的,因为它没有0xff常量。我故意将
I++;
放入循环中,因为我不喜欢在中修改循环变量条件本身,在我看来更清楚。但它也有缺点:如果循环中有一个
continue
语句,那么这实际上是一个偏好问题。遗憾的是,我们没有对
循环进行反向测试
:)这不是太大了吗?
#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;
    }
}