#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.
这是怎么回事?
外部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)