| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2291 人关注过本帖
标题:[休闲][转载]一定要看哦
只看楼主 加入收藏
neverTheSame
Rank: 3Rank: 3
来 自:江西农业大学
等 级:新手上路
威 望:9
帖 子:1511
专家分:0
注 册:2006-11-24
收藏
得分:0 
我用TC2.0可能通过.

wap酷禾网(http://wap.),提供免费的、优质的、快捷的wap资源下载服务。
2007-06-17 23:45
herbert_1987
Rank: 5Rank: 5
等 级:贵宾
威 望:15
帖 子:1314
专家分:0
注 册:2007-5-13
收藏
得分:0 
main(_)
里面的 "_"又是什么来的?

人生重要的不是所站的位置,而是所朝的方向
2007-06-17 23:48
百年不亮
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:789
专家分:0
注 册:2006-4-14
收藏
得分:0 

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 ! 觉得分析的好就给点掌声


2007-06-18 00:00
百年不亮
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:789
专家分:0
注 册:2006-4-14
收藏
得分:0 

我用几个编译器试了下,vc6.0和tc2.0可以编译通过, DEV-C++和VS2003.NET会报错
2007-06-18 00:03
herbert_1987
Rank: 5Rank: 5
等 级:贵宾
威 望:15
帖 子:1314
专家分:0
注 册:2007-5-13
收藏
得分:0 

人生重要的不是所站的位置,而是所朝的方向
2007-06-18 00:03
无玩过界
Rank: 1
等 级:新手上路
威 望:2
帖 子:246
专家分:0
注 册:2007-2-20
收藏
得分:0 
举个例子
#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码表就可以知道。
如果有不对地方望大家指正一下

2007-06-18 01:07
百年不亮
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:789
专家分:0
注 册:2006-4-14
收藏
得分:0 
不就是一个下标运算符吗,搞的长篇大论的.

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

2007-06-18 01:24
mp3aaa
Rank: 5Rank: 5
等 级:贵宾
威 望:17
帖 子:2013
专家分:8
注 册:2006-2-15
收藏
得分:0 
我来把它打回原形
#include <stdio.h>
main()
{
int i=1;
char a[]="J!Mpwf!Zpv\1";
for(--i;putchar(a[i++]-1););
}

羊肉串 葡萄干 哈密瓜!!
2007-06-18 01:29
无玩过界
Rank: 1
等 级:新手上路
威 望:2
帖 子:246
专家分:0
注 册:2007-2-20
收藏
得分:0 
对我们来说,argc++["J!Mpwf!Zpv\1"]-1这样的写法,我们是没有见过,我当初也不了解,后来通过自己同其它人一起总结出来的,对于你这样高手,我没有话讲。

2007-06-18 01:36
无玩过界
Rank: 1
等 级:新手上路
威 望:2
帖 子:246
专家分:0
注 册:2007-2-20
收藏
得分:0 
to:百年不亮,你怎样深刻理解数组下标运算符[],来告诉大家好吗?

2007-06-18 01:41
快速回复:[休闲][转载]一定要看哦
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025396 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved