在“for”循环中运行整个“unsigned char”范围

Posted

技术标签:

【中文标题】在“for”循环中运行整个“unsigned char”范围【英文标题】:Running through entire range of `unsigned char` in `for` loop 【发布时间】:2014-01-08 03:22:26 【问题描述】:

我想在for 循环中遍历unsigned char 的整个范围。假设我想打印从 0 到 255 的所有数字,我应该如何实现呢?

以下代码将是一个无限循环:

for (unsigned char i=0; i<=255; i++)
    cout << i << endl;

这个漏掉0还是255,看是i++还是++i

for (unsigned char i=0; ++i<=255; i++)
    cout << i << endl;

我可以在 for 循环之前/之后放置一个 cout 来弥补丢失的条目,但我寻求更优雅的解决方案。

任何帮助将不胜感激! (也欢迎whiledo-while 循环!)

【问题讨论】:

你想要 C 答案还是 C++ 答案? 可能是 C++,流 I/O 是什么。 只需使用int,然后投射即可。 @FredLarson 两者都可以。 @BlackAdder 怎么不优雅? 【参考方案1】:

试试,

unsigned char i = 0 ;
do 
  cout << i << endl ;

while ( ++i ) ;

do .. while 相对于其他形式的好处是您可以在测试条件之前免费运行一次。出于这个原因,这是一个重要的工具(如果只是不经常使用的话),在程序员的工具箱中。

【讨论】:

因为当i255 那么++i 会溢出回0,不是吗? 这也是我用汇编语言编写它的方式。 谢谢@woolstar,这个答案很漂亮。我现在开始喜欢编程了,不用感谢这个 gem。 @AlexisWilke 希望这与该程序集非常接近。 @BlackAdder,不过要小心。此行为仅对无符号整数类型进行了明确定义。对不起,如果那又毁了它。【参考方案2】:

使用boost::irange 可以被认为是优雅的(live example):

#include <boost/range/irange.hpp>
#include <iostream>

int main()

    for(auto i : boost::irange(0, 256) )
        std::cout << i << "\n";
    return 0;

【讨论】:

【参考方案3】:

你可以拆散它:

for (unsigned char i = 0; i < 16; ++i)

    unsigned char base=i*16;
    for (unsigned char j = 0; j < 16; ++j)
    
        unsigned char val=base+j;
        std::cout << val << std::endl;
    

【讨论】:

以上是关于在“for”循环中运行整个“unsigned char”范围的主要内容,如果未能解决你的问题,请参考以下文章

为什么switch在Javascript数组的for循环中只运行一次?

在 innerHTML 中使用 for 循环

vb中退出这次for循环和退出整个for循环各是啥

如何在命令提示符下创建一个“for”循环?

For循环不打印游标中的最后一条记录

R使用if next break in for循环出错