【C】a+=(a++)

 1 #include<stdio.h>
 2 int main()
 3 {
 4     int a=1,a1=1;
 5     int b=1,b1=1;
 6     printf("(1)后自加:\n");
 7     printf("a+=(a++):\n");//
 8     printf("%d\t%d\t%d\n",a,a+=(a++),a);
 9     printf("%d\n",a);
10     printf("a1+(a1++):\n");//
11     printf("%d\t%d\t%d\n",a1,a1+(a1++),a1);
12     printf("%d\n",a1);
13
14     printf("\n(2)前自加:\n");
15     printf("b+=(++b):\n");//
16     printf("%d\t%d\t%d\n",b,b+=(++b),b);
17     printf("%d\n",b);
18     printf("b1+(++b1):\n");//
19     printf("%d\t%d\t%d\n",b1,b1+(++b1),b1);
20     printf("%d\n",b1);
21     return 0;
22 }

总的来说挺纠结的,实际上面两行的结果计算涉及到如下2个点:

(1)复合赋值运算符‘+=‘ 和 赋值运算符‘=’ 的左右值的计算顺序;

(2)前自加和后自加的变量本身的值何时更新;

  1 8:        printf("%d\t%d\t%d\n",a,a+=(a++),a);
  2 0040D75E   mov         eax,dword ptr [ebp-4]
  3 0040D761   push        eax
  4 0040D762   mov         ecx,dword ptr [ebp-4]
  5 0040D765   add         ecx,dword ptr [ebp-4]
  6 0040D768   mov         dword ptr [ebp-4],ecx
  7 0040D76B   mov         edx,dword ptr [ebp-4]
  8 0040D76E   mov         dword ptr [ebp-14h],edx
  9 0040D771   mov         eax,dword ptr [ebp-14h]
 10 0040D774   push        eax
 11 0040D775   mov         ecx,dword ptr [ebp-4]
 12 0040D778   push        ecx
 13 0040D779   push        offset string "%d\t%d\t%d\n" (00422fdc)
 14 0040D77E   mov         edx,dword ptr [ebp-4]
 15 0040D781   add         edx,1
 16 0040D784   mov         dword ptr [ebp-4],edx
 17 0040D787   call        printf (00401080)
 18 0040D78C   add         esp,10h
 19 9:        printf("%d\n",a);
 20 0040D78F   mov         eax,dword ptr [ebp-4]
 21 0040D792   push        eax
 22 0040D793   push        offset string "%c\n" (0042201c)
 23 0040D798   call        printf (00401080)
 24 0040D79D   add         esp,8
 25 10:       printf("a1+(a1++):\n");//
 26 0040D7A0   push        offset string "a1+(a1++):\n" (00422fd0)
 27 0040D7A5   call        printf (00401080)
 28 0040D7AA   add         esp,4
 29 11:       printf("%d\t%d\t%d\n",a1,a1+(a1++),a1);
 30 0040D7AD   mov         ecx,dword ptr [ebp-8]
 31 0040D7B0   push        ecx
 32 0040D7B1   mov         edx,dword ptr [ebp-8]
 33 0040D7B4   add         edx,dword ptr [ebp-8]
 34 0040D7B7   mov         dword ptr [ebp-18h],edx
 35 0040D7BA   mov         eax,dword ptr [ebp-18h]
 36 0040D7BD   push        eax
 37 0040D7BE   mov         ecx,dword ptr [ebp-8]
 38 0040D7C1   push        ecx
 39 0040D7C2   push        offset string "%d\t%d\t%d\n" (00422fdc)
 40 0040D7C7   mov         edx,dword ptr [ebp-8]
 41 0040D7CA   add         edx,1
 42 0040D7CD   mov         dword ptr [ebp-8],edx
 43 0040D7D0   call        printf (00401080)
 44 0040D7D5   add         esp,10h
 45 12:       printf("%d\n",a1);
 46 0040D7D8   mov         eax,dword ptr [ebp-8]
 47 0040D7DB   push        eax
 48 0040D7DC   push        offset string "%c\n" (0042201c)
 49 0040D7E1   call        printf (00401080)
 50 0040D7E6   add         esp,8
 51 13:
 52 14:       printf("\n(2)前自加:\n");
 53 0040D7E9   push        offset string "%d\t%d\n" (00422fc0)
 54 0040D7EE   call        printf (00401080)
 55 0040D7F3   add         esp,4
 56 15:       printf("b+=(++b):\n");//
 57 0040D7F6   push        offset string "b+=(++b):\n" (00422fa8)
 58 0040D7FB   call        printf (00401080)
 59 0040D800   add         esp,4
 60 16:       printf("%d\t%d\t%d\n",b,b+=(++b),b);
 61 0040D803   mov         ecx,dword ptr [ebp-0Ch]
 62 0040D806   push        ecx
 63 0040D807   mov         edx,dword ptr [ebp-0Ch]
 64 0040D80A   add         edx,1
 65 0040D80D   mov         dword ptr [ebp-0Ch],edx
 66 0040D810   mov         eax,dword ptr [ebp-0Ch]
 67 0040D813   add         eax,dword ptr [ebp-0Ch]
 68 0040D816   mov         dword ptr [ebp-0Ch],eax
 69 0040D819   mov         ecx,dword ptr [ebp-0Ch]
 70 0040D81C   push        ecx
 71 0040D81D   mov         edx,dword ptr [ebp-0Ch]
 72 0040D820   push        edx
 73 0040D821   push        offset string "%d\t%d\t%d\n" (00422fdc)
 74 0040D826   call        printf (00401080)
 75 0040D82B   add         esp,10h
 76 17:       printf("%d\n",b);
 77 0040D82E   mov         eax,dword ptr [ebp-0Ch]
 78 0040D831   push        eax
 79 0040D832   push        offset string "%c\n" (0042201c)
 80 0040D837   call        printf (00401080)
 81 0040D83C   add         esp,8
 82 18:       printf("b1+(++b1):\n");//
 83 0040D83F   push        offset string "b1+(++b1):\n" (00422fb4)
 84 0040D844   call        printf (00401080)
 85 0040D849   add         esp,4
 86 19:       printf("%d\t%d\t%d\n",b1,b1+(++b1),b1);
 87 0040D84C   mov         ecx,dword ptr [ebp-10h]
 88 0040D84F   push        ecx
 89 0040D850   mov         edx,dword ptr [ebp-10h]
 90 0040D853   add         edx,1
 91 0040D856   mov         dword ptr [ebp-10h],edx
 92 0040D859   mov         eax,dword ptr [ebp-10h]
 93 0040D85C   add         eax,dword ptr [ebp-10h]
 94 0040D85F   push        eax
 95 0040D860   mov         ecx,dword ptr [ebp-10h]
 96 0040D863   push        ecx
 97 0040D864   push        offset string "%d\t%d\t%d\n" (00422fdc)
 98 0040D869   call        printf (00401080)
 99 0040D86E   add         esp,10h
100 20:       printf("%d\n",b1);
101 0040D871   mov         edx,dword ptr [ebp-10h]
102 0040D874   push        edx
103 0040D875   push        offset string "%c\n" (0042201c)
104 0040D87A   call        printf (00401080)
105 0040D87F   add         esp,8
106 21:       return 0;
107 0040D882   xor         eax,eax
108 22:   }

另外,关于printf()函数参数表中计算顺序是从右边往左计算的。

时间: 2024-10-13 11:49:50

【C】a+=(a++)的相关文章

【Kettle】4、SQL SERVER到SQL SERVER数据转换抽取实例

1.系统版本信息 System:Windows旗舰版 Service Pack1 Kettle版本:6.1.0.1-196 JDK版本:1.8.0_72 2.连接数据库 本次实例连接数据库时使用全局变量. 2.1 创建新转换:spoon启动后,点击Ctrl+N创建新转换 2.2 在新转换界面中,右键点击DB连接,系统会弹出[数据库连接]界面. windows系统环境下,可用${}获取变量的内容. 说明: 连接名称:配置数据源使用名称.(必填) 主机名称:数据库主机IP地址,此处演示使用本地IP(

详解go语言的array和slice 【二】

上一篇  详解go语言的array和slice [一]已经讲解过,array和slice的一些基本用法,使用array和slice时需要注意的地方,特别是slice需要注意的地方比较多.上一篇的最后讲解到创建新的slice时使用第三个索引来限制slice的容量,在操作新slice时,如果新slice的容量大于长度时,添加新元素依然后使源的相应元素改变.这一篇里我会讲解到如何避免这些问题,以及迭代.和做为方法参数方面的知识点. slice的长度和容量设置为同一个值 如果在创建新的slice时我们把

【转载】C++拷贝构造函数(深拷贝,浅拷贝)

对于普通类型的对象来说,它们之间的复制是很简单的,例如:int a=88;int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量.下面看一个类对象拷贝的简单例子. #include <iostream>using namespace std;class CExample {private:     int a;public:     CExample(int b)     { a=b;}     void Show ()     {        cout<

【BZOJ】1799: [Ahoi2009]self 同类分布

[题意]给出a,b,求出[a,b]中各位数字之和能整除原数的数的个数.1 ≤ a ≤ b ≤ 10^18 [算法]数位DP [题解] 感觉这种方法很暴力啊. 枚举数位和1~162(不能枚举0,不然会模0,相当于除0),记忆化f[pos][sum][val],sum表示当前数位和,val表示数字取模枚举的数位和. 每次sum+i和(val*10+i)%MOD转移. sum用减法优化,即记忆化(MOD-sum),但是枚举过程中都要memset,导致效率低下,记忆化效果很差. 要什么方法才能跑1.3s

【BZOJ4942】[Noi2017]整数 线段树+DFS(卡过)

[BZOJ4942][Noi2017]整数 题目描述去uoj 题解:如果只有加法,那么直接暴力即可...(因为1的数量最多nlogn个) 先考虑加法,比较显然的做法就是将A二进制分解成log位,然后依次更新这log位,如果最高位依然有进位,那么找到最高位后面的第一个0,将中间的所有1变成0,那个0变成1.这个显然要用到线段树,但是复杂度是nlog2n的,肯定过不去. 于是我在考场上yy了一下,这log位是连续的,我们每次都要花费log的时间去修改一个岂不是很浪费?我们可以先在线段树上找到这段区间

【BZOJ4945】[Noi2017]游戏 2-SAT

[BZOJ4945][Noi2017]游戏 题目描述 题解:2-SAT学艺不精啊! 这题一打眼看上去是个3-SAT?哎?3-SAT不是NPC吗?哎?这题x怎么只有8个?暴力走起! 因为x要么不是A要么不是B,所以直接2^8枚举所有x就行了.然后就变成了一个2-SAT问题.假设有两场游戏1,2,分别可以使用的地图为A1,A2,B1,B2,如果有一个限制是1 A 2 A,那么选A1就必须选A2,然后我这个沙茶就开开心心的拿了55分. 为什么不对?我建出来的图显然不对偶啊!考虑逆否命题,选A1就必须选

【BZOJ】2337: [HNOI2011]XOR和路径

[算法]期望+高斯消元 [题解]因为异或不能和期望同时运算,所以必须转为加乘 考虑拆位,那么对于边权为1取反,边权为0不变. E(x)表示从x出发到n的路径xor期望. 对于点x,有E(x)=Σ(1-E(y))(边权1)||E(y)(边权0)/t[x]  t[x]为x的度. 那么有n个方程,整体乘上t[x]确保精度,右项E(x)移到左边--方程可以各种变形. 每次计算完后*(1<<k)就是贡献. 逆推的原因在于n不能重复经过,而1能重复经过,所以如果计算"来源"不能计算n,

【BZOJ】[HNOI2009]有趣的数列

[算法]Catalan数 [题解] 学了卡特兰数就会啦>_<! 因为奇偶各自递增,所以确定了奇偶各自的数字后排列唯一. 那么就是给2n个数分奇偶了,是不是有点像入栈出栈序呢. 将做偶数标为-1,做奇数标为+1,显然当偶数多于奇数时不合法,因为它压不住后面的奇数. 然后其实这种题目,打表就可知啦--QAQ 然后问题就是求1/(n+1)*C(2n,n)%p了,p不一定是素数. 参考bzoj礼物的解法. 看到网上清一色的素数筛+分解质因数解法,不解了好久,感觉写了假的礼物-- 后来觉得礼物的做法才比

【Vue】详解Vue生命周期

Vue实例的生命周期全过程(图) (这里的红边圆角矩形内的都是对应的Vue实例的钩子函数) 在beforeCreate和created钩子函数间的生命周期 在beforeCreate和created之间,进行数据观测(data observer) ,也就是在这个时候开始监控data中的数据变化了,同时初始化事件 created钩子函数和beforeMount间的生命周期 对于created钩子函数和beforeMount间可能会让人感到有些迷惑,下面我就来解释一下: el选项的有无对生命周期过程

【Beta】 第七次Daily Scrum Meeting

第七次meeting会议 [Beta] 第七次Daily Scrum Meeting 一.本次会议为第七次meeting会议 二.时间:10:00AM-10:20AM 地点:禹州楼 三.会议站立式照片 四.今日任务安排 成员 昨日任务 今日任务 林晓芳 重观界面问题上的美化处理 对现有的东西进行总结,主要是关于此次采用的一些方法.库等等 林清青 与其他组探讨交流进度 对于接下里的任务方向与大家探讨 陈惠 重观界面问题上的美化处理 基于现有的东西进行更深入的完善,例如,如何让闹钟提醒更人性化 郑莹