以下for循环功能如何不同

时间:2014-01-03 10:01:32

标签: c

#include<stdio.h>
void main()
{
    int a,b,c;
    for(b = c = 10; a = "- FIGURE?, UMKC,XYZHello Folks,TFy!QJu ROo TNn(ROo)SLq SLq ULo+UHs UJq TNn*RPn/QPbEWS_JSWQAIJO^NBELPeHBFHT}TnALVlBLOFAkHFOuFETpHCStHAUFAgcEAelclcn^r^r\\tZvYxXyT|S~Pn SPm SOn TNn ULo0ULo#ULo-WHq!WFs XDt!"[b+++21];)
    {
        for(;a-->64;)
        {
            putchar((++c == 'Z') ? (c = c/9) : (33^b&1));
        }
    }
    getch();
}

c语言的上述程序将输出显示为印度地图。在上面的程序中,外部for循环有2个插槽,第三个空闲。但是我理解程序是如何工作的但是怀疑是外部for循环的条件槽用作赋值槽。在语法和逻辑上这应该是错误的但它的工作原理。根据数组索引中的值,相应char的ASCII码被赋予变量a 这是如何工作的?

1 个答案:

答案 0 :(得分:7)

外部for循环的条件槽将字符串文字的一个字符分配给a,同时递增b。由于赋值运算符也返回指定的值,因此外部for循环的条件将成为字符串文字的某些字符的值。因为字符串是'\0' - 在C中分隔,所以条件为真,直到表达式b++ + 21到达字符串的结尾(然后返回字符串的最后一个(额外)字符,并且它是&#39; s等于0,因此评估为false

实际上,这是一个用于迭代字符串的常见C语言的混淆且更复杂的版本,如下所示:

char *string = "my string";
int i;
for (i = 0; string[i]; ++i)
    /* do something with string[i] */

可以简化为:

int i = 0;
for (; string[i++]; )
    /* do something with string[i] */

此外,当前字符可以提取到单独的char变量c

int i = 0;
char c;
for (; c = string[i++]; )
    /* do something with c */

也可以使用while循环:

while (c = string[i++])
    /* do something with c */