晕了,i++ ++i i-- --i到底有什么不同,怎样区别他们?原理是什么?
晕了,i++ ++i i-- --i到底有什么不同,怎样区别他们?原理是什么?
[解决办法]
int b = i++;//先将i值赋给b,然后i自加
int b = ++i;//i先自加,然后将自加后的i值赋给b
int b = i--;//先将i值赋给b,然后i自减
int b = --i;//i先自减,然后将自减之后的i值赋给b
[解决办法]
运行符写在变量前面是先运算后用,而写在后面则是先用后加,比如
- C/C++ code
int a,b,c;a=1;b=a++;//先用后加,所以相当于b=a;a++;结果就是b=1,a=2;a=1;c=++a;//先加后用,所以相当于a++;c=a;结果就是a=2;c=2;//另外--和++一样,我就不说了
[解决办法]
不过最好不要在一个式子里面写多个++或--,不同的编译器会得到不同的结果
比如:C=++a+b++之类的,最好不要出现这种式子
[解决办法]
我自己总结的规律来记住这个
i 前表不变----就是i如果在++或--前面,表达式的值先不变,然后在自己运算,
不管怎样i一定会加或减的,只是时间的问题
[解决办法]
呵呵!告诉你一个很简单的记忆法,以后你就不会用错了!
对于 i++ ++i i-- --i 这种形式的代码记住一条:
变量名在前面的--------先使用变量,用完了再运算变量
运算符在前面的--------先运算变量,算完了再使用变量
也就是说,那个写在前面就优先!
[解决办法]
啥都不用说了,直接看它的汇编代码,让你记忆深刻点...
int b = i++;//先将i值赋给b,然后i自加
mov eax,dword ptr [ebp-8]
mov dword ptr [ebp-0Ch],eax
mov ecx,dword ptr [ebp-8]
add ecx,1
mov dword ptr [ebp-8],ecx
int b = ++i;//i先自加,然后将自加后的i值赋给b
mov edx,dword ptr [ebp-8]
add edx,1
mov dword ptr [ebp-8],edx
mov eax,dword ptr [ebp-8]
mov dword ptr [ebp-0Ch],eax
int b = i--;//先将i值赋给b,然后i自减
mov ecx,dword ptr [ebp-8]
mov dword ptr [ebp-0Ch],ecx
mov edx,dword ptr [ebp-8]
sub edx,1
mov dword ptr [ebp-8],edx
int b = --i;//i先自减,然后将自减之后的i值赋给b
mov eax,dword ptr [ebp-8]
sub eax,1
mov dword ptr [ebp-8],eax
mov ecx,dword ptr [ebp-8]
mov dword ptr [ebp-0Ch],ecx
这下应该明白了吧?
CSYNYK的方法的确不错,但是如果不从汇编级来了解的话,遇到
cout<<++(i++)<<(++i)++<<endl;
估计就不知道会错在哪里了吧...所以我还是建议楼主要知其然更要自其所以然...
[解决办法]
1.i++
可以拆成: i;i+=1;
如:int j;int i=0;
j=i++;==>j=i;i=i+1;
2.++i可以拆成 i=i+1;i;
如:int j;int i=0;
j=++i;==>i=i+1;j=i;
3.i--
可以拆成: i;i-=1;
如:int j;int i=0;
j=i--;==>j=i;i=i-1;
4.--i可以拆成 i=i-1;i;
如:int j;int i=0;
j=--i;==>i=i-1;j=i;
[解决办法]
举个例子
int i =5;
i++; // i++作为一个整体的值是5。 这句执行完后i的值变成6。
++i;// 接着上面的来,上面的i已经是6了。++i作为整体的值是7,执行后i的值也是 //7
i--;--i;的用法是一样的。
[解决办法]
后缀++和前缀++
理解这个,我在看C++ LANUAGHE的时候
觉得作者这个应该可以帮助你理解,好记.
为什么叫C++而不是++C呢?
因为C++是在C语言基础上发展起来D.呵呵~~
如i=5;
ch=i++;
bh=++i;
结果是什么呢?
++运算是由右到左运算
ch在i上发展起来,以它为基础,所以呢是5
此时i自加运算得6
那bh是多少呢?我想楼主应该知道了.
[解决办法]
这哪有什么原理,你用的语言编译器就是这么处理的。
谁都可以创造语言,写出配套编译器,谁写的好就用谁的
将来你写出更好的,随便怎么解释都可以,别人都只能听你的
这就是规则!
该背的还是要背,怎么省事就怎么背。
别钻牛角尖
别看csdn上面有很多玄乎的问题,说穿了,是用来玩的
现实中出现,那就是你编程习惯不好