我在如何在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...
TL; DR:我想以尽可能少的代码迭代这些整数/字符。
谢谢。
答案 0 :(得分:4)
只需使用两个迭代变量
for(auto lo=65, hi=lo+32; lo!=91; ++lo,++hi) {
/* use lo */
/* use hi */
}
编译器可以优化lo
和hi
之一或两者。否则,您可以添加到单个迭代变量
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)
答案 6 :(得分:0)
这可能会对你有帮助!
for (int i = 'A', j = 'a'; i <= 'Z'; i++, j++)
{
// Body
}