C++ 迭代无符号整数的所有值的最漂亮的方法

C++ 迭代无符号整数的所有值的最漂亮的方法,c++,c++11,iteration,C++,C++11,Iteration,我想迭代整数的所有可能值。此代码不起作用,因为终止条件从未变为false: for (uint32_t i = 0; i <= 0xFFFFFFFF; i++) std::cout << i << std::endl; 对于(uint32\u t i=0;i我将使用std::numeric\u limits,因为它最能说明您的意图 int lowest = std::numeric_limits<int>::lowest(); int max

我想迭代整数的所有可能值。此代码不起作用,因为终止条件从未变为false:

for (uint32_t i = 0; i <= 0xFFFFFFFF; i++)
    std::cout << i << std::endl;

对于(uint32\u t i=0;i我将使用
std::numeric\u limits
,因为它最能说明您的意图

int lowest = std::numeric_limits<int>::lowest();
int max    = std::numeric_limits<int>::max();
for (int i = lowest; i < max; ++i)
   cout << i << '\n';
cout << max << '\n';
int lowest=std::numeric_limits::lowest();
int max=std::numeric_limits::max();
对于(int i=最低;icout您无法检查循环头中的中断条件,因为您需要排除最大值

相反,在循环体中执行检查,并将标题中的检查留空:

for (auto i = std::numeric_limits<int>::lowest(); ; ++i) {
    std::cout << i << '\n';
    if (i == std::numeric_limits<int>::max())
        break;
}
for(自动i=std::numeric_limits::lowest();++i){

std::cout我会使用这样的东西:

uint32_t i = 0;
do
{
    // Your code here.
    i++;
}
while (i != 0);
我个人觉得它比涉及
std::numeric_limits
的解决方案更优雅。

正如@NicosC所说,请记住,您不应该对有符号整数使用相同的技巧,因为有符号溢出是未定义的行为。

好吧,它在循环结束时调用条件测试,这意味着使用
do{}while()

#包括
#包括
int main(){
自动beg=std::数值限制::最低();
自动结束=标准::数值限制::最大值();

std::cout也许您可以使用
int64\u t
索引并循环到
0x100000000
?使用
std::numeric\u limits::max()
。请注意,有符号整数的溢出是未定义的行为。“漂亮”是任意的。我认为只需要循环,然后使用一个额外的std::cout语句比定义一个函数来执行更干净。如果它让您感到非常不舒服,也许可以使用zneak的建议,使用一个不会溢出的更大的数据类型。如果您需要循环更大的数据类型,您也会遇到同样的问题。这一结果是半等效的作为我的第一个代码示例生成的代码,它会导致无限循环。该代码被破坏。对于有符号类型,这会调用未定义的行为。但只需将其更改为
True。我是否要删除答案?我想现在可以了。可能需要补充的是,它永远不会打印最大值,但可以在t之后作为另一个打印添加循环。不需要使用低效的
std::function
。这正是我想要的:检查必须在执行循环体之后进行,而不是之前。太好了!重新创建
do{}whie()
从2016年开始。@NikosC仍然需要进行检查?怎么会这样?@NikosC这不是do while循环的工作方式。试着运行一个。@n.m.事实上,我收回了这一点。你是对的。:-P可以完成。注意,这是带符号整数的UB。但不带符号整数也可以。
for (auto i = std::numeric_limits<int>::lowest(); ; ++i) {
    std::cout << i << '\n';
    if (i == std::numeric_limits<int>::max())
        break;
}
auto i = std::numeric_limits<unsigned>::lowest();
do {
    std::cout << i << '\n';
} while (i++ < std::numeric_limits<unsigned>::max());
uint32_t i = 0;
do
{
    // Your code here.
    i++;
}
while (i != 0);
#include <limits>
#include <iostream>

int main() {
    auto beg = std::numeric_limits<unsigned>::lowest();
    auto end = std::numeric_limits<unsigned>::max();

    std::cout << beg << " " << end << std::endl;

    long long count = 0LL;

    auto i = beg;
    do {
        ++count;
        if ((count % (1024LL*1024LL)) == 0)
            std::cout << count << std::endl;
    } while(i++ != end);
    std::cout << count << std::endl;

    return 0;
}