C语言优先级和(i++)+(i++)与(++i)+(++i)

转载 2012年03月30日 21:48:28

在网上看到了这篇文章,很不错就转载了,摘自:http://www.cnblogs.com/hustcat/archive/2009/06/02/1494311.html

与在前面:++(--)有太多让人困惑的地方,(i++)+(i++)与(++i)+(++i)有什么不同?为什么不同?如果从机器的角度去理解,就会豁然开朗。

 先来看段程序:


int main()
{
    int i=3;
    int j=(i++)+(i++);
    
//    int j=(++i)+(++i);
    printf("%d,%d\n",i,j);
}


(1)在VC 6.0下:

对于(i++)+(i++):
结果:i=5,j=6

相应的汇编代码为(有详细注释):

8B 45 FC             mov         eax,dword ptr [ebp-4]   ;i->eax
03 45 FC             add         eax,dword ptr [ebp-4]    ;i+i=6
89 45 F8             mov         dword ptr [ebp-8],eax    ;6->j
8B 4D FC             mov         ecx,dword ptr [ebp-4]    ;i->ecx(=3)
83 C1 01             add         ecx,1                           ;ecx=4
89 4D FC             mov         dword ptr [ebp-4],ecx    ;4->i
8B 55 FC             mov         edx,dword ptr [ebp-4]    ;i->edx
83 C2 01             add         edx,1                           ;edx=5
89 55 FC             mov         dword ptr [ebp-4],edx    ;5->i

对于(++i)+(++i):
结果:i=5,j=10
相应的汇编代码为:

8B 45 FC             mov         eax,dword ptr [ebp-4]    ;i->eax (=3)
83 C0 01             add         eax,1                           ;eax=4
89 45 FC             mov         dword ptr [ebp-4],eax    ;4->i
8B 4D FC             mov         ecx,dword ptr [ebp-4]    ;i->ecx
83 C1 01             add         ecx,1                           ;ecx=5
89 4D FC             mov         dword ptr [ebp-4],ecx    ;5->i
8B 55 FC             mov         edx,dword ptr [ebp-4]    ;i->edx
03 55 FC             add         edx,dword ptr [ebp-4]    ;edx=10 ,即i+i
89 55 F8             mov         dword ptr [ebp-8],edx    ;10->j


(2)在gcc 3.2.2下:

对于(i++)+(i++):

结果:i=5,j=6相应的汇编代码为:


c7 45 fc 03 00 00 00     movl    $3, -4(%ebp)        ;3->i
8b 55 fc        movl    -4(%ebp), %edx        ;i->edx (=3)
8b 45 fc        movl    -4(%ebp), %eax        ;i->eax    (=3)
8d 04 10         leal    (%eax,%edx), %eax     ;i+i=6 ->eax
89 45 f8        movl    %eax, -8(%ebp)        ;6->j
8d 45 fc        leal    -4(%ebp), %eax        ;&i->eax
ff 00            incl    (%eax)            ;i++ ,即i=4,注意这里为寄存器间接寻址
8d 45 fc        leal    -4(%ebp), %eax        ;&i->eax
ff 00            incl    (%eax)                ;i++,即i=5

对于(++i)+(++i):
结果:i=5,j=10
相应的汇编代码为:


movl    $3, -4(%ebp)        ;3->i
leal    -4(%ebp), %eax        ;&i->eax
incl    (%eax)            ;i++,即i=4
leal    -4(%ebp), %eax        ;&i->eax
incl    (%eax)            ;i++, i=5
movl    -4(%ebp), %eax        ;i->eax, eax=5
addl    -4(%ebp), %eax        ;i+i ->eax ,eax=10
movl    %eax, -8(%ebp)        ;10->j

可见,对于VC6.0和gcc,二者的结果一致,但是gcc 3.2.2生成的汇编代码明显比VC6.0高效、简洁。这也许是因为VC 6.0出现较早的原因吧。

代码本身是没有意义,但是通过这段代码却可以理解机器层面的东西,而这也是我想表达的。


事实上,C#语言及Java语言对表达式的副作用及在运算中的表现有严格的规定,也就是说,有确定的答案。但在C及C++,没有确定的答案,因为这在语言中没有规定,是由编译器来决定的。
从这个角度看,永远不要写出这种“应试教育”的产物。




c++ 中 `++i` 与 `i++` 在运算表达式中的优先级

在算术表达式中,优先级高的运算符先运算,优先级低的运算符后运算,不同的优先级直接影响表达式的计算结果。1. 说明 gcc中 gcc中的加法运算表达式中,是按照从左到右按顺序,如果运算符两边有++i操...
  • llcchh012
  • llcchh012
  • 2015年09月07日 15:39
  • 1545

c语言编程规范和范例及写给自己的C++编程规范

c语言编程规范和范例 1 排版 1    1-1:程序块要采用缩进风格编写,缩进的空格数为4个。 说明:对于由开发工具自动生成的代码可以有不一致。 1    1-2:相对独立的程序块之间、变量说明之...
  • benpaobagzb
  • benpaobagzb
  • 2016年02月29日 21:46
  • 2000

操作系统五六章作业答案

习题   5.1为什么对调度程序而言,区分CPU约束程序和I/O约束程序很重要?    答: CPU的成功调度依赖于进程的如下属性:进程执行由CPU执行和I/O等待周期组成,进程在这两个状态之...
  • SpadgerZ
  • SpadgerZ
  • 2016年11月14日 09:53
  • 2264

C语言i++和++i的区别

i++和++i的区别虽然简单,还是记录一下吧!     【知识点】      1. 对于普通独立的语句,i++和++i是一样的,如:         i++; 等效于i=i+1;         +...
  • u013046097
  • u013046097
  • 2016年12月03日 11:09
  • 1991

c语言中i++与++i的区别及运行效率

在c语言我们会经常把i++与++i弄混淆。 i++    是先使用,再自加(其自加是在遇到结束标志时才会进行) 即a = i;i=i+1; ++i    是先自加,再使用 即 i=i+1; a...
  • Mormont
  • Mormont
  • 2016年11月11日 19:39
  • 4736

计算机操作系统(第3版)课后习题答案(完整版)

第一章 1.设计现代OS的主要目标是什么? 答:(1)有效性 (2)方便性 (3)可扩充性 (4)开放性 2.OS的作用可表现在哪几个方面? 答:(1)OS作为用户与计算机硬件系统之间的接口 ...
  • u010752082
  • u010752082
  • 2016年03月04日 16:55
  • 10956

WINDOWS核心编程(第五版)高清完整版PDF+源代码

  • 2013年07月19日 16:41
  • 26.01MB
  • 下载

C语言中 i++ 和 ++i 有什么区别?

擦。。C语言忘得一干二净了。。转一个基础的 今天有同学问C语言中for循环里那个 i++ 和 ++i 是否有区别,我告诉他在for循环中是没有区别的,现在具体说一下 i++ 和 ++i 的区别。...
  • u014330807
  • u014330807
  • 2014年03月25日 19:46
  • 4592

i++和i--运算符优先级

1、问题背景 /** * 测试i++和i-- */ package com.you.model; /** * @author YouHaiDong * @date 2014-08-16 *...
  • you23hai45
  • you23hai45
  • 2014年08月16日 15:01
  • 1170

杭州地区IT公司招聘分析与求职建议

作者:郭孝星 微博:郭孝星的新浪微博 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells Github:https://githu...
  • AllenWells
  • AllenWells
  • 2015年08月27日 13:47
  • 2670
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C语言优先级和(i++)+(i++)与(++i)+(++i)
举报原因:
原因补充:

(最多只允许输入30个字)