#include <stdio.h> main(_){char*x="*b#**000**I#*****2***0***#-.**2*-.*-#-.**2*-4.#*****2****6#****00**0.#";while(_=*x/4)_-=8,printf("\n%*s"+!!_,_+_,"_/_/_/"+*x++%4*2);}
昨天看了CSDN一个贴子,有人拿这个程序来考别人,今天十分无聊就改了改。
to chengstone
我把程序分了行,这样就有点清楚了:
#include <stdio.h> void main(int _)
{
char*x="*b#**000**I#*****2***0***#-.**2*-.*-#-.**2*-4.#*****2****6#****00**0.#"; while(_=*x/4) _-=8,printf("\n%*s"+!!_,_+_,"_/_/_/"+*x++%4*2); } 1.在c语言中,标志符号的定义是:第一个可以是下划线或字母,以后的可以是划线或字母或数字
此程序就用了一个下划线作为标志符.
2.在c语言中,有一中逗号运算符,他从左到右进行运算.返回最右面的表达式的值
经过上面的等价改造,程序变成:
#include <stdio.h> void main(int a)
{
char*x="*b#**000**I#*****2***0***#-.**2*-.*-#-.**2*-4.#*****2****6#****00**0.#"; while(a=*x/4)
{
a-=8;
printf("\n%*s"+!!a,a+a,"_/_/_/"+*x++%4*2);
} } 程序的巧妙之处就在printf的构造上.
其中"\n%*s" *有特殊用法 ,它用来给出格式化串的长度
另外,还有"\n%*s"+!!a 的加法操作牵扯到指针的加法
以及!!a ,相当于 ((a==0)?0:1)
等内容
经鉴定,此题极其阴险,确实无聊!!