|
|
发表于 2012-6-27 17:28:10
|
显示全部楼层
本帖最后由 fujian810 于 2012-6-28 08:22 编辑
这段代码在linux下编译通过了,输出结果Love FishC.com,我做了几个测试才分析出其中的缘由,在这里给大家一起分享下我的测试过程,为了更好的理解这段程序,我们需要知道以下几个概念:
1、i是全局变量,默认初始化为0;
2、for循环语句需要熟悉,for循环一共有三个部分:第一部分是初始化,第二部分是for循环结束条件,第三部分是变量变化;for循环后是循环体的执行语句。
第一部分初始化是分号,意味着没有初始化。
第二部分是for循环结束语句i[ "]<i;++i){--i;}" ] ,只要i[ "]<i;++i){--i;}" ] 大于0,for循环就一直持续,这里很多人不理解,但是学过汇编的同志看到这里会会心一笑,还记得汇编寻址中的3[bx]么,如果[bx]是代表数据段的数组,那么3[bx]相当于该数组的第4个元素(下标从0开始),因此i[ "]<i;++i){--i;}" ] 的含义是什么呢?"]<i;++i){--i;}"是内存中一个字符串数组,而i[ "]<i;++i){--i;}" ]就代表这个字符串数组中i下标,即a="]<i;++i){--i;}",i[ "]<i;++i){--i;}" ] = a,故而0[ "]<i;++i){--i;}"]就是']',']'的ascii值显然是大于0的,那么什么情况i[ "]<i;++i){--i;}" ] 为0呢?我们看下 "]<i;++i){--i;}"这个字符串长度14,因此,14 ["]<i;++i){--i;}"]的返回值为0,即i为14时for循环结束。
第三部分是变量的变化,通常的for循环中是i++,这里是一个函数,read函数,下面我们来分析下read函数。read('-'-'-',i+++"Love FishC.com!\n",'/'/'/'));首先看下read函数的第一个参数:'-'-'-'是什么意思呢?'-'代表是一个字符,'-'-'-'显然代表着'-'字符减去'-'字符值为0,第二个参数是i+++"Love FishC.com!\n",这个语句可以分解成两句:i+"Love FishC.com!\n";i++;i+"Love FishC.com!\n"的分析是这样的,"Love FishC.com!\n"是一个字符串数组,i+"Love FishC.com!\n"代表这个字符串数组的地址偏移为i;第三个参数是'/'/'/',有了第一个参数的基础,这里可以知道'/'/'/'=1;
第三部分read函数的原型是read(j,i,p),这里j=0,i = i+++"Love FishC.com!\n",p = 1;
现在我们来分析下重头戏write函数:write(j/p+p,i---j,i/i),相当于write(1, i+++"Love FishC.com!\n"--,1),这里需要了解一个概念,write函数的原型是write(fd,buf,len),将buf中len长度输出到fd中,在linux中测试是将buf的内容输出到终端中,这里的fd的值可以任意,不一定是1, i+++"Love FishC.com!\n"--有了前面的 i+++"Love FishC.com!\n"分析,再多两个--也无所谓了,分析照旧,只是地址有偏移而已,我们知道函数调用变量非指针格式,因此值在调用后发生变化。
结论:下面我们来串一下这段程序,这个程序实际是这样的,我给出一个伪算法
q = "Love FishC.com!\n";
while(i<strlen( "]<i;++i){--i;}"))
{
write(1,q,1);
i++;
}
因此结果是输出字符串"Love FishC.com!\n"前14("]<i;++i){--i;}"的长度)个字符Love FishC.com
|
|