当前位置: 代码迷 >> C语言 >> [休闲][转载]一定要看哦
  详细解决方案

[休闲][转载]一定要看哦

热度:272   发布时间:2007-06-17 23:45:46.0
我用TC2.0可能通过.
----------------解决方案--------------------------------------------------------
main(_)
里面的 "_"又是什么来的?
----------------解决方案--------------------------------------------------------

main(_)的参数是 _ ,相当于argc,下面我把这个程序修改一下,看起来就清楚了

[CODE]main(int argc)
{
for(--argc;putchar(argc++["J!Mpwf!Zpv\1"]-1););
}[/CODE]

在没有参数的情况下argc的初值为1.
深刻理解数组下标运算符[]的知道这个程序等价于下面的:

[CODE]main(int argc)
{
for(--argc;putchar("J!Mpwf!Zpv\1"[argc++]-1););
}[/CODE]

"J!Mpwf!Zpv\1"的值是首字符地址,写成下面这样就更清楚了:


[CODE]main(int argc)
{
char s[]="J!Mpwf!Zpv\1";
for(--argc;putchar(s[argc++]-1););
}[/CODE]

"J!Mpwf!Zpv\1" 中的各个字符在-1之后就是"I Love You\0"

这个程序的巧妙之处就在于用'_'替换'argc',然后利用C中下标运算符,C的诡异离奇造就了这个程序的巧妙

OVER ! 觉得分析的好就给点掌声



----------------解决方案--------------------------------------------------------

我用几个编译器试了下,vc6.0和tc2.0可以编译通过, DEV-C++和VS2003.NET会报错
----------------解决方案--------------------------------------------------------

----------------解决方案--------------------------------------------------------
举个例子
#include<stdio.h>
int main()
{int a[]={1,2,3};
int i=2;
printf("%d %d\n",i[a],a[i]);
return 0;}
其实从程序可以看数组可以这样使用
至于为什么因为是数组也是指针,但大家不要忘记是指针不是数组,所以可以写成这样*(a+i),a是数组首地址,i指是普通数字,也是数组下标数,大家应该从数组反应到指针,a+i在这里可以交换成i+a,这个符合数学理论,交换法嘛,呵呵,所以可以这样写的,当然这样写不好,但是可以的。这很快看出原因,我们再看putchar的特性 函数putchar()把ch的低字节写到标准输出流stdout中。功能上,putchar()等价于putc(ch,stdout).由于字符型变元都在调用函数时变换成整型,程序中可以用字符型做putchar()的变元成功时,putchar()返回写入的字符;出错返回EOF_++["J!Mpwf!Zpv\1"]-1关健怎样了解这个
大家想想这个是不是数组,其实可以看成一个数组,但不是数组,它只是具备有数组形式,有这个特殊地方是"J!Mpwf!Zpv\1",它是地址,
_是关于main(argv)带参数则在命令行里面都很常见的变量,默认为1。
之前不是说过数组也是指针,_++["J!Mpwf!Zpv\1"]-1)可以看成*((_++)+"J!Mpwf!Zpv\1")-1,同例子的*(i+a)有类似,再对应ASCII码表就可以知道。
如果有不对地方望大家指正一下

----------------解决方案--------------------------------------------------------
不就是一个下标运算符吗,搞的长篇大论的.

一句话:下标运算符就是实现地址加偏移寻址,地址是指针值或数组名


----------------解决方案--------------------------------------------------------
我来把它打回原形
#include <stdio.h>
main()
{
int i=1;
char a[]="J!Mpwf!Zpv\1";
for(--i;putchar(a[i++]-1););
}
----------------解决方案--------------------------------------------------------
对我们来说,argc++["J!Mpwf!Zpv\1"]-1这样的写法,我们是没有见过,我当初也不了解,后来通过自己同其它人一起总结出来的,对于你这样高手,我没有话讲。
----------------解决方案--------------------------------------------------------
to:百年不亮,你怎样深刻理解数组下标运算符[],来告诉大家好吗?
----------------解决方案--------------------------------------------------------
  相关解决方案