anonymous.c
源码:
int i;main(){for(;i["]<i;++i){--i;}"];read(‘-‘-‘-‘,i+++"hell\o, world!\n",‘/‘/‘/‘));}read(j,i,p){write(j/p+p,i---j,i/i);}
这样的代码看着很眼晕,咱们用编缉器将它格式化后的代码如下:
int i;
main()
{
for(; i["]<i;++i){--i;}"]; read(‘-‘-‘-‘,i+++"hello, world!\n",‘/‘/‘/‘));
}
read(j,i,p)
{
write(j/p+p,i---j,i/i);
}
相信格式化后的代码对于一个C新手来说,看着还是很晕,咱们继续往下看。一点一点解读
这段代码只有一个for循环而没有循环体。
for循环分3个部分(由“;”隔开)
第一部分是将变量赋值
第二部分是循环体的条件判断语句,当判断语句的值为 大于0 或 非NULL值 时执行循环体后再将变量加1,再进行判断语句……..直到判断语句为0或NULL值时退出。
第三部分就是将变量 增1或减1 (增n, 减n)
我们为了方便分析将代码中的字符串和表达式用#define来表示
#define A ‘-‘-‘-‘ //大家不要认为这是一个字符串,那你就错了。这是一个表达式,字符-减去字符-,结果为0。没看明白?去学习运算符优先规则吧。
#define B ‘/‘/‘/‘ //同样,这个也不要以为是字符串,这是除法运算,结果为1。
#define C "hell\ //这个才是真正的字符串。有人会问为啥不直接写“hello,world\n”,而写成"hell\
o, world!\n" //o, world!\n",注意\o中间是回车换行,为啥这样写,为了让你晕。这是个转义字符, 显示出来还是英文件字母o,如果不换行编译器会提示警告,换行后就没有提示了。
#define D "]<i;++i){--i;}" //作者这样写这个字符串完全是为了忽悠你,当时我刚看时也被忽悠了。再写的怎么花里胡哨放在for循环中它也是个字符串。所以不要被你的眼睛所欺骗。字符串长度是14,为啥要说明字符串长度? hello, world!字符串长度是13,不要忘记还有\n呢。
int i;
main()
{
for(; i[D]; read(A,i+++C,B));//这里的D字符串长度是14,所以循环14次。
}
read(j,i,p)
{
write(j/p+p,i---j,i/i);
}
这个read函数在for循环里看起来还是有些晕,咱们来解析下。
read(A,i+++C,B) //前面咱们已经说过了,A=0,B=1,替换后的函数为 read(0,i+++C,1)
将参数替换后的
read(0,i,1) //参数i 和main上面定义的i(for循环体中的)可不是同一个变量,不要搞混。i的值为 i+++"hell\o, world!\n",这个表达式中的i是for循环中的i变量。
{
write(0/1+1,i---0,i/i);
//也可以写成 write(1,i---0,1);
//将参数i替换后 write(1,i+++"hell\o, world!\n"---0,1)此时的i是for循环中的i
//i+++"hell\o, world!\n"---0,这个字符串是根据变量i取字符串长度的,比如i变量现在是7,那么字符串的结果是world!\n。 其实字符串的地址加上变量i的结果,然后再将变量i增1。后面的---0也是障眼法。
}
完全替换后的for
for(;i["]<i;++i){--i;}"];write(1,i+++"hell\o, world!\n"---0,1))
看着晕不,哈哈。
i["]<i;++i){--i;}"]
这个字符串也可以写成这样"]<i;++i){--i;}"[i]
运算结果是一样的。字符串中的每个字符都是非0值或非NULL,for的条件判断语句会执行14次,哦也。
for循环的自增量 i 在write函数中,找出它来吧,亲。
整个程序的运行差不多也就清楚了。你明白了吗?
小弟也是刚学c再加上小学语文没毕业,有解读不清楚的地方请大神们用力吐嘈!
时间: 2024-11-05 12:35:08