C语言编程中前置++和后置++ 运算的详解及实例代码

这篇文章主要介绍了前置++和后置++ 的相关资料,并附示例代码,帮助大家学习参考,需要的朋友可以参考下

一般认为前置++是先将变量的值加1,然后使用加1后的值参与运算;而后置++是先使用该值参与运算,然后再将该值加1。

先看第一个例子:


package test;

public class Plus_Test01 {

 public static void main(String[] args) {

  int i = 100;

  i = i++;

  System.out.println(i);

 }

}

猜猜结果是什么?

接着看第二个:

package test;

public class Plus_Test02 {

 public static void main(String[] args) {

  int k = 100;

  while (true) {

   if (k++ > 100) {

    // System.out.println(k);

    break;

   }

   System.out.println(k);

  }

 }

}

猜猜结果是什么?

实际上,不管是前置++,还是后置++,都是先将变量的值加1,然后才继续计算的。二者之间真正的区别是:前置++是将变量的值加1后,使用增值后的变量进行运算的,而后置++是首先将变量赋值给一个临时变量,接下来对变量的值加1,然后使用那个临时变量进行运算。小编推荐一个学C语言/C++的学习裙【 六二七,零一二,四六四 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

对于如下代码片段(前置++):

int i=1;

int j=++i*5;

实际第二句上相当于:

i+=1; //将i加1

j=i*5; //将加1后的值与之进行计算, 此结果为:10

而对于如下代码片段(后置++):

int i=1;

int j=i++*5;

第二句上相当于:

int temp=i;  // 将i赋值给一个临时变量

i+=1;        //将i加1

j=temp*5; 

//将临时变量与之计算, 此结果为:5

对于第一个例子,相当于:

int temp=i;

i+=1;

i=temp; //

所以结果应该为不变的,即100。

第一个例子的汇编代码为:

public static void main(java.lang.String[]);

 descriptor: ([Ljava/lang/String;)V

 flags: ACC_PUBLIC, ACC_STATIC

 Code:

 stack=2, locals=2, args_size=1

  0: bipush  100

  2: istore_1

  3: iload_1

  4: iinc   1, 1 //local var中第二个 加1

  7: istore_1 //保存至local var

  8: getstatic  #16 // Field java/lang/System.out:Ljava/io/PrintStream;

  11: iload_1 //加载的参数为栈中的第二个,即仍然为100

  12: invokevirtual #22 // Method java/io/PrintStream.println:(I)V

  15: return

对于第二个例子,其实不难,结果是101,注意看一下流程,以后不能在犯这样的错误了。(流程为:首先比较temp=i,temp>100,,显然不成立,将i+=1,跳到syso那一句,打印的当然是101,再次循环同样有temp=i,temp>100,这次是成立的,然后i+=1,直接跳出循环,不会执行while里面的语句)。

第二个例子的汇编(只选取了main方法):

public static void main(java.lang.String[]);

 descriptor: ([Ljava/lang/String;)V

 flags: ACC_PUBLIC, ACC_STATIC

 Code:

 stack=2, locals=2, args_size=1

  0: bipush 100 //100压栈

  2: istore_1 //保存至第二个local var(第一个local var 是方法参数)

  3: iload_1 //从第二个local var加载

  4: iinc 1, 1 //给local var的2号位置的int值增加1(局部变量自增,结果仍然在local var中,操作数栈顶1不会变)

  7: bipush 100 //100压栈

  9: if_icmple 15 //比较操作数栈顶的两个int整型值,如果第一个小于或者等于第二个的话,然后跳转到15行

  12: goto 25 //否则跳转到25行(即操作数栈顶1>操作数栈顶2)

  15: getstatic  #2 // Field java/lang/System.out:Ljava/io/PrintStream;

  18: iload_1 // //从第一个个local var加载

  19: invokevirtual #3 // Method java/io/PrintStream.println:(I)V //调用该方法

  22: goto 3 //再次回跳至3,再次循环

  25: return //退出

第三个例子:

package test;


 public class Plus_Test03 {


  static int proPlus() {

   int i = 55;

   int j = ++i;

   return j; //56

  }


  static int postPlus() {

   int i = 55;

   int j = i++;

   return j; //55

  }


  public static void main(String[] args) {

  System.out.println(proPlus());//56

   System.out.println(postPlus());//55


  }

}

第三个例子的汇编:

static int proPlus();

 descriptor: ()I

 flags: ACC_STATIC

 Code:

  stack=1, locals=2, args_size=0

   0: bipush  55 //55压栈

   2: istore_0 //将int型栈顶的存储至第一个local var

   3: iinc   0, 1 //第一个local var加1

   6: iload_0 //从local var加载

   7: istore_1 //保存至第二个local var

   8: iload_1 //栈顶为第二个local var

   9: ireturnstatic int postPlus();

 descriptor: ()I

 flags: ACC_STATIC

 Code:

  stack=1, locals=2, args_size=0

   0: bipush  55 

   2: istore_0

   3: iload_0 //加载至栈

   4: iinc   0, 1 //第一个local var加1

   7: istore_1

   8: iload_1

   9: ireturn

可见,前置++ 和后置++的不同点在于上面蓝色(//第一个local var加1)的部分,这两部分是反过来的。对于前置来说,会将local 

var中的数加1然后加载至栈中,而后置则是先从栈local var中加载至栈,然后将local var的加1,相当于留了一个备份。

结论:

一。前置、与后置++都是先将变量的值加1,而不是前置++先加1然后运算,而后置++先运算后加1。

二。从程序上说,后置++先将变量赋值给一个临时变量,然后将变量的值加1,接下来使用那个临时变量参与运算。

三。从指令上说,后置++在执行增值指令(iinc)前,先将变量的值压入栈,执行增值指令后,使用的是之前压入栈的值。

希望通过此文,彻底理解前置++和后置++的运算区别

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,718评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,683评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,207评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,755评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,862评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,050评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,136评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,882评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,330评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,651评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,789评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,477评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,135评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,864评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,099评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,598评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,697评论 2 351

推荐阅读更多精彩内容