首先a是一个整形。
main函数代参数的情况下是这样定义的。
main(int i,char *m[]);有几种情况。
1.main(int i)
2.main(int i,char *m[])
3.main(int 1,char *m[],char *n[])
//以上更改,因为我发现编译的时候报错。然后查了下发现的。
我们遇到的是第一种情况
其实当a被赋值指针的时候会报错,因为变量赋值不对称的。但是也是能用。如何使用不报错,后面会说。
然后调用函数的时候,都是先进行赋值运算。如:
fun(i=1); 是先赋值,使i等于1,然后调用fun函数。那么上面的函数可以简化为:
main(a)
{
a="main(a){printf(a,34,a=%c%s%c,34);}";
printf(a,34,a,34);
}
有TC的话,可以看出,这个程序和原来的程序的结果是一样的。
然后上面可以写成这样,看着明白:
main(a)
{
a="main(a){printf(a,34,a=%c%s%c,34);}";
printf("main(a){printf(a,34,a=%c%s%c,34);}",34,a,34);
}
然后就非常清晰了。34 以字符输出为:"。指针a指向的字符串以%s字符串输出。然后在输出:"
结果就是:main(a){printf(a,34,a="main(a){printf(a,34,a=%c%s%c,34);}",34);}
然后这里有个重点是a是int变量,这里被用作字符串指针来用,指针地址位数与int位数其实在TC中是一致的(远指针除外)。
想编译的时候不报错,仅仅需要一步强制转换:
main(a)
{
(char *)a="main(a){printf(a,34,a=%c%s%c,34);}";
printf(a,34,a,34);
getch();
}
追问你太厉害了!我居然明白了!分给你了!
追答a在这个函数中其实是整形。main(a)的时候已经默认定义了。
然后类型不匹配,其实也是可以赋值的,只不过在TC中会警告而已。
如 :
int a;
a="123";
这样在TC中虽然语法错误,但是可以正常运行的,只不过整形a的值是123字符串的地址而已。
如:
int a;
(char *)a="123";
将a强制转换成字符串指针。这里就不会报错了。也就是说int 和char * 定义的变量的取值范围一样。其实不一样的位数也是可以强制转换的,只不过最高位会被丢弃
本回答被提问者采纳