int __cdecl printf(const char * __restrict__ _Format,...);
printf()的第一个参数是个字符指针类型的,也就是第一个逗号之前的部分,后面的不再这样认为了.
再看原来的代码:
main(){ char *a="main(){char *a=%c%s%c;printf(a,34,a,34);}"; printf(a,34,a,34); }
a是一个字符指针, printf()的第一个参数也是指针,把a代入printf()后得到:
printf(main(){char *a=%c%s%c;printf(a,34,a,34);},34,a,34);
这样明白了吗? printf()第一个逗号前的东西都会原样输出, 遇到%c%s%c后就和后面的东西配对解析. %c对应两个34, ASCII码34号就是'"', 而%s对应a. 所以输出就是:
程序代码:
main(){char *a=%c\ //这个%c对应第一个34, 被转化为'"' %s\ //这个%s对应char *a="main(){char *a=%c%s%c;printf(a,34,a,34);}";中a的内容, 不包括'"' %c\ //这个%c和第一个一样,被转化为'"' ;printf(a,34,a,34);}
个人理解.
[ 本帖最后由 vvvcuu 于 2015-6-16 19:04 编辑 ]