向前和向后跳转for循环

时间:2017-04-25 15:32:22

标签: c++ c c++11

我在如何在C ++(14)中实现for循环时遇到了一些问题。 这是一个正常的循环:

for (j = 65; j < 91; ++j) {
    body...
}

对于第一次迭代,j将是65.对于第二次迭代,我希望它增加32(第二次迭代j = 97)。对于第三个,它必须回到65 + 1 =&gt; 66。 基本上,j值将是这样的:65,97,66,98,67,99,68,100,69,101 ......等等。在谈论使用的字符时,我希望代码最小化。

P.S:如果它有用,那些值是A, a, B, b, C, c, D, d, F, f...

的ASCII值

TL; DR:我想以尽可能少的代码迭代这些整数/字符。

谢谢。

7 个答案:

答案 0 :(得分:4)

只需使用两个迭代变量

for(auto lo=65, hi=lo+32; lo!=91; ++lo,++hi) {
  /* use lo */
  /* use hi */
}

编译器可以优化lohi之一或两者。否则,您可以添加到单个迭代变量

void work(int);
for(auto j=65; j!=91; ++j) {
  work(j);
  work(j+32);
}

答案 1 :(得分:2)

只是迭代这些值:

for(auto ch : {'A', 'a', 'B', 'b', 'C', 'c', 'D', 'd', 'F', 'f'}) {
   /* use ch */
}

答案 2 :(得分:2)

没有必要来回跳跃。迭代一个字符范围并使用toupper / tolower转到相反的字符。例如

for (char ch = 'A'; ch <= 'Z'; ch++)
{
    char lower = tolower(ch);
    //use ch
    //use lower
}

只要'A''Z'是一个连续的范围,这就可以了。如果您没有连续范围,可以使用

之类的东西
for (char ch = std::numeric_limits<char>::min(); ch <= std::numeric_limits<char>::max(); ch++)
{
    if(isalpha(ch) && isupper(ch))
    {
        char lower = tolower(ch);
        //use ch
        //use lower
    }
}

答案 3 :(得分:1)

提示:使用^ =

for (j = 65; j < 91; ++j,j^=' ') {
    body...
}

答案 4 :(得分:1)

在第一次迭代时考虑。在第一次迭代(i = 0)时考虑事实你有一对值(current = 65,next = 97),on second(current = 97,next = 68)

for(char c = 65, n=97; c+n<=213; ++c,c^=n,n^=c,c^=n)
   body

缩短它

  for(char c = 65, n=97; n<123; swap(c,n), c++)

  for(char c = 65, n=97; n!=91; swap(c,n), c++)

65的二进制表示是100 0001,97 - 101 0001,依此类推, 所以甚至可以通过按位或c ^ 32从奇数创建步骤。增量必须仅在奇数步骤上完成。如果我们假设,布尔值的隐式转换为true,则为整数值yield 1,它看起来如此

  for(char c = 65; c!=91; c^=32, c+=c<91)

如果不是真的

  for(char c = 65; c!=91; c^=32, c+=1-c/91)

同样简短的解决方案,它使用for循环的初步步骤和赋值运算符返回值的事实

  for(char c = 64; (c+=c<91)!=91; c^=32)

NB。除非你希望读取代码的每个人都讨厌你,否则永远不要写这样的循环

答案 5 :(得分:1)

你的目标很短。我相信这会赢。

for (j=65;j!=91;(j^=' '),j+=(j<91))

live example

答案 6 :(得分:0)

这可能会对你有帮助!

for (int i = 'A', j = 'a'; i <= 'Z'; i++, j++)
{
    // Body
}