满意答案

wqnn2980

2013.06.17

采纳率:51%    等级:12

已帮助:6027人

我原来在别的贴回答过这样的问题, 这里再发一次, 如果你没看明白中间的, 你就记住开头和结尾就行了~

==========================================================

此类语法在不同的编译器上得出的结果不同!取决于不同编译器对此类语法的解析方式. 以下是两种情况, 实际上可能因为编译器众多而不只这两种.

1.对++j的处理的两种情况,一种是在表达式进行运算之前就将++j计算,然后再进行表达式运算;第二种是在表达式运算的过程当中进行++j自增并计算表达式的值。

2.两种情况对j++的处理方式一样,都是表达式运算完成后自增,所以j++对表达式的运算无影响。

第一种情况:

就TC来说,他是第一种,先把++j进行自增,然后再进行加法运算,而不管++j出现的顺序,比如:

m+=(j++)+(++j)+(j++);

有一个++j,所以先将j自增一次,假设j = 2,自增一次后为3,最后的运算就是:

m += 3 + 3 + 3;

而不是

m += 2 + 3 + 4, 虽然结果都是m += 9

你试着把他们的顺序换一下:

m+=(j++)+(j++)+(++j);

++j换到了后面,结果仍然是3+3+3,而不是2+2+3,

再如:

m+=(j++)+(++j)+(j++)+(++j);

++j出现了2次,那么先将j自增两次,为4,表达等价于:

m+= 4 + 4 + 4 + 4;

而不是

m+=2+3+3+4;

这个表达式的汇编:

1 inc si ;自增j

2 inc si

3 mov ax,si ;加法运算

4 add ax,si

5 add ax,si

6 add ax,si

7 add di,ax

8 inc si ;自增j

9 inc si

第1行和第2行是将++j自增,3到7行是加法运算。8、9行是j++的自增,不参与表达式的运算。

所以使用这种编译方式的编译器,++j的位置对结果无影响。

第二种情况:

VC、dev c,好像gcc也是这种情况,他是在运算过程中对++j进行运算。所以++j的位置对结果有影响。

其中VC的还比较奇特,比如

m=(j++)+(++j)+(++j)+(j++)+(j++);

的汇编:

mov eax, DWORD PTR _j$[ebp]

add eax, 1

mov DWORD PTR _j$[ebp], eax ++j;

mov ecx, DWORD PTR _j$[ebp] m += j;

add ecx, DWORD PTR _j$[ebp] m += j;

mov edx, DWORD PTR _j$[ebp]

add edx, 1

mov DWORD PTR _j$[ebp], edx ++j;

add ecx, DWORD PTR _j$[ebp] m += j;

add ecx, DWORD PTR _j$[ebp] m += j;

add ecx, DWORD PTR _j$[ebp] m += j;

mov DWORD PTR _m$[ebp], ecx

结果是

m = 3 + 3 + 4 + 4 + 4 = 18

但是将其中一个++j调换顺序:

m=(j++)+(++j)+(j++)+(++j)+(j++);

结果是:

m = 3 + 3 + 3 + 4 + 4 = 17

但是

m = (j++)+(j++)+(++j)+(++j)+(j++)+(j++);

结果却是

m = 2 + 2 + 3 + 4 + 4 + 4 = 19

就是说前面两个在第二个++j之前都提前进行了++j,而第三个表达式没有。

总之比较奇特,跟VC编译器代码优化什么的有关系。而且你将VC6的编译改成release,上面第三个表达式的结果就是

m = 4 + 4 + 4 + 4 + 4 + 4 = 24,不是19了!

=============================================================

结论:

平常编程99.999%不会遇到这种情况,就算遇到了也不要这么用,不同的编译器产生的结果不同,影响你的程序的可移植性。 另外不除了因为不同的编译器结果可能不同,相同的编译器使用不同的编译选项(比如代码优化)也可能使结果不同。

10分享举报

C语言计算表达式咋写,C语言如何计算表达式(x++)+(++x)+(x++)相关推荐

  1. 大一c语言实践报告怎么写,c语言实践报告范文

    只有努力付诸实践,才有真知灼见.下面是学习啦为大家带来的c语言实践报告范文,希望可以帮助大家. c语言实践报告范文1: 在科技高速发展的今天,计算机互联网在人们之中的作用越来越突出.而c语言作为一种计 ...

  2. c语言计算个人所得税作业,写一个程序,输入任何一个公民的月收入和五险一金,能够计算他应缴纳的个人所得税.用C语言...

    问题描述: 写一个程序,输入任何一个公民的月收入和五险一金,能够计算他应缴纳的个人所得税.用C语言 3.我国的个人所得税实行累进税率,计算办法是:用全月应纳税所得额分为几个级别,分别乘以累进税率,几个 ...

  3. c语言计算个人成绩平均分,C语言 | 计算总平均分及第n个人的成绩

    例32:有一个班,3个学生,各学习4门课,C语言编程实现计算总平均分数以及第n个学生的成绩,要求使用指针. 解题思路:今天这道例题分为3部分,下述求的是第3个学生,读者请思考怎么改为求第n个学生. 第 ...

  4. c语言计算二次函数顶点坐标,C语言编写一个求一元二次方程的实根的程序。 编辑一个小程序去做一元二次方程的求解(b^24ac)...

    导航:网站首页 > C语言编写一个求一元二次方程的实根的程序. 编辑一个小程序去做一元二次方程的求解(b^2>4ac) C语言编写一个求一元二次方程的实根的程序. 编辑一个小程序去做一元二 ...

  5. C语言计算数字乘积根,c语言,求任意一个整数各位数字之积

    点击查看c语言,求任意一个整数各位数字之积具体信息 答:求整数各位和,将整数各个位分离出来的方法(除10取模)很常用. 函数如下 int intsum(int n) { int sum = 0; wh ...

  6. c语言计算时间的编程,C语言实现时间戳转日期的算法(推荐)

    1.算法 时间是有周期规律的,4年一个周期(平年.平年.平年.闰年)共计1461天.Windows上C库函数time(NULL)返回的是从1970年1月1日以来的毫秒数,我们最后算出来的年数一定要加上 ...

  7. c语言计算文件摘要值,c语言文件操作摘要.ppt

    c语言文件操作摘要 第十章 文件 10.1 C文件概述 文件:存储在外部介质上数据的集合,是操作系统数据管理的单位 文件处理方法 缓冲文件系统:高级文件系统,系统自动为正在使用的文件开辟内存缓冲区 非 ...

  8. c语言计算sinx并输出,c语言sinx实验报告.doc

    c语言sinx实验报告 实验题目 C语言基本控制结构 实验时间 2014 年 3月 27日 实验地点 DZ1402 实验成绩 实验性质 □验证性 √设计性 □综合性 教师评价: □算法/实验过程正确: ...

  9. c语言计算年龄的编程,C语言实战开发: 利用if 实现“税后工资”,“输出年龄”...

    C语言实战开发 2019-11-15 用所学知识编写简单的两个程序 程序一:给定工资,计算税后工资并输出 程序二:以阿拉伯数字给定年龄,输出数字年龄的英文翻译 一.税后工资实战 /* 输入工资 计算税 ...

最新文章

  1. Matlab编程与数据类型 -- M文件的编辑和存储
  2. python分析基金数据,[Python数据分析]numpy基金会,基础
  3. 互联网寒冬裁员潮,这些人可能有点慌!
  4. KOMODO:用16S rDNA序列预测其培养基配方的网站
  5. java B2B2C springmvc mybatis电子商务平台源码-Consul服务发现原理...
  6. B站up主用AI还原李焕英 动态影像
  7. CSS float的相关图文详解(二)
  8. 如何更改Docker默认的images存储位置
  9. 2020牛客国庆集训派对day4 What Goes Up Must Come Down
  10. 单链表的应用(电话本)
  11. 2018 终了,是时候秀出我的 Git 进化日志了!
  12. linux系统怎么组内网,Linux/Unix操作系统处于内网的桌面控制
  13. C51单片机实验——中断实验
  14. linux单引号作用,单引号 双引号如何输入(Linux运维:单引号与双引号的使用)...
  15. 游戏服务器设计(C#)简单版
  16. 《西游记》中话“修行”【转】
  17. 网格背景教师公开课教学课件PPT模板
  18. Linux 监控文件变化
  19. 魔百盒CM201-2_YS、ZG、CH、(emmc,nand)_海思3798mv300_全套刷机固件
  20. UVa-12325宝箱

热门文章

  1. 8086状态标志寄存器的英文含义(调试用
  2. library的英语怎么读音_英语元音与辅音
  3. luogu p1652 圆
  4. sim800c GPRS模块的透传模式
  5. POJ3461 【KMP(粗糙模板)】
  6. JAVA设计模式之【职责链模式】
  7. vs2010编译curl为static库及测试
  8. Ruby笔记三(类、对象、属性)
  9. U-Boot工作过程
  10. [转载] 【Python】Python3 字典 fromkeys()方法