【C/C++】自增运算符++详解
2016-05-03 15:30
459 查看
关于 a = 2 * a++ *(3 – ++a)的运算过程分析:
将以上源代码进行反汇编之后的结果如下:
int a = 2;
00C313DE mov dword ptr [a],2 // a = 2;
a = 2 * a++*(3 - ++a);
00C313E5 mov eax,dword ptr [a]
00C313E8 add eax,1
00C313EB mov dword ptr [a],eax
00C313EE mov ecx,3
00C313F3 sub ecx,dword ptr [a]
00C313F6 mov edx,dword ptr [a]
00C313F9 shl edx,1
00C313FB imul edx,ecx
00C313FE mov dword ptr [a],edx
00C31401 mov eax,dword ptr [a]
//a = (2 * a *(3 - ++a)) +1 运算结果赋值给a
00C31407 mov dword ptr [a],eax
下图为整个运算的详细图解:
![](https://img-blog.csdn.net/20160503152721060?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
根据以上分析,可得出a = 2 *a++ *(3 – ++a) 整个运算过程如下:
1、 由于()优先级最高,所以先计算括号里面的表达式,括号里面++a的运算优先级高于" - ",所以最先计算a = a + 1;然后计算(3- (++a))。
2、 由于" * "优先级相同且为左结合性,所以先计算2 * a,然后计算(2 *a)* (3 - ++a)。
3、 a++为后自增,所以最后计算((2 * a)* (3 - ++a)) + 1,所以最终结果为1。
结论:前自增运算(++a),先将a的值+1,然后将+1后的a值参与运算试的运算;后自增运算符(a ++),在进行自增运算时会先计算运算试的结果然后再将整个运算结果+1,而不是a参与运算后a的结果立即+1。
思考:
请计算出以下表达式的输出结果:
a = 2 * (a++) *(3 - ++a);
a= 2 * a++ *(a++ * (3 - ++a))
将以上源代码进行反汇编之后的结果如下:
int a = 2;
00C313DE mov dword ptr [a],2 // a = 2;
a = 2 * a++*(3 - ++a);
//进行++a运算 |
00C313E8 add eax,1
00C313EB mov dword ptr [a],eax
// 进行3 – (++a)运算 |
00C313F3 sub ecx,dword ptr [a]
// 进行2 * a运算 |
00C313F9 shl edx,1
// 进行2 * a * (3 - ++a)运算 |
00C313FE mov dword ptr [a],edx
// 进行(2 * a * (3 - ++a))+1运算 |
00C31404 add eax,1 |
00C31407 mov dword ptr [a],eax
下图为整个运算的详细图解:
根据以上分析,可得出a = 2 *a++ *(3 – ++a) 整个运算过程如下:
1、 由于()优先级最高,所以先计算括号里面的表达式,括号里面++a的运算优先级高于" - ",所以最先计算a = a + 1;然后计算(3- (++a))。
2、 由于" * "优先级相同且为左结合性,所以先计算2 * a,然后计算(2 *a)* (3 - ++a)。
3、 a++为后自增,所以最后计算((2 * a)* (3 - ++a)) + 1,所以最终结果为1。
结论:前自增运算(++a),先将a的值+1,然后将+1后的a值参与运算试的运算;后自增运算符(a ++),在进行自增运算时会先计算运算试的结果然后再将整个运算结果+1,而不是a参与运算后a的结果立即+1。
思考:
请计算出以下表达式的输出结果:
a = 2 * (a++) *(3 - ++a);
a= 2 * a++ *(a++ * (3 - ++a))
相关文章推荐
- 黑马程序员——java基础之那些让人纠结的运算符
- 指针和指针运算符一起时的运算规则(比如*p++和*++p的区别)
- C语言查遗补缺——关于自增运算符的有趣的例子
- More Effective C++议题【六】:关于自增、自减操作符的一些讨论
- ++i 和 i++ 的理解
- C语言小结
- C++书籍清单
- C++中的static用法小结
- C++ Primer 学习笔记
- C语言中的IO函数小计
- C/C++混编之 extern "C"
- c++中斜杠和反斜杠的作用 相对路径和绝对路径
- C++;每周一些题(1)
- leecode 242---Valid Anagram
- C++小结
- C++中指向子类的父类指针访问父、子类成员时的权限和函数隐藏规则
- C++杂七杂八小知识
- nyoj10 skiing
- 复化simpson求积算法 c++实现
- C++11 多线程编程