以下for循环功能如何不同

Ash*_*tri 3 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();
}
Run Code Online (Sandbox Code Playgroud)

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

Mic*_*bus 7

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

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

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

可以简化为:

int i = 0;
for (; string[i++]; )
    /* do something with string[i] */
Run Code Online (Sandbox Code Playgroud)

而且,当前字符可以提取到一个单独的char变量c:

int i = 0;
char c;
for (; c = string[i++]; )
    /* do something with c */
Run Code Online (Sandbox Code Playgroud)

也可以使用while循环:

while (c = string[i++])
    /* do something with c */
Run Code Online (Sandbox Code Playgroud)