读书人

i = i + 一的疑问

发布时间: 2013-03-17 13:48:31 作者: rapoo

i = i + 1的疑问
i = (int)&(((char*)i)[1]);
这条语句实现i = i + 1;
疑问:将i转换成字符型指针(指向哪),再加1,此时指向哪了?
汇编中这条语句直接是:add eax,1 为什么直接加1了? c
[解决办法]
i[1] == *(i+1) 结果是一个char
注意这个i这里的char*类型的
char* + 1
+的是sizeof(char) 即还是1
然后把再用& 得到 char*
再把char*转换为 int

做了这么多事情其实只是
i = i + 1;
垃圾一样的写法 毫无意义
[解决办法]
step 1: 把i转化成char*
step 2: 取i的第1个元素的地址(指针加1)
step 3: 把指针变成int型.

说明几点:
1)如果i是char型数组,那么第一步不需要进行转换
2)如果i不是char型数组,那么此表达是仍然可以表示i的地址只增加1
3)如果直接写成i=i+1,那么如果i是其他类型的数组,比如int型的话,i的地址增加4=sizeof(int),而不是1

[解决办法]
i = (int)&(((char*)i)[1]);
将i cast成char *,指向哪里不重要,重要的是char * +1的操作只会增加1(想想如果是int *,+1会增加4),[1]就是完成取第一个“假想”的数组元素,然后由&取回地址,那么就是+1的地址了,最后再cast回int正确的类型,完成量上的+1。
说白了就是用数组/指针的方法完成毫不相关的int类型的数量的+1。
i存于eax,自然直接在它上面+1即可。

类比
i = (int)&(((char *)i)[2]);完成i += 2;
i = (int)&(((int *)i)[1]);完成i += sizeof(int);
i = (int)&(((double *)i)[3]);完成i += sizeof(double) * 3;

个人认为,此完全属于“奇技淫巧”,是那些闲的蛋疼的人折腾出来的。
一个简单的i += 1;或者i++,编译器就能够很好的优化了。

读书人网 >C++

热点推荐