++i 和 i++ 的理解

原创 2016年08月30日 20:47:46

1.C语言为什么要使用++运算符呢? 

   C语言从Ken Thompson早期的B语言中继承了++和--。Thompson创造这类运算符是因为他的B语言编译器可以对++i产生比i = i + 1更简洁的翻译。这些运算符已经成为C语言根生蒂固的一部分,但是对于今天的编译器来说,使用++和--运算符不会使编译后的程序变得更短小或更快,继续使用这些运算符是因为他们非常简洁和便利。

2.运算符优先级表格:


3.++i 和 i++ 具体实现方法:

1> ++i是先增加后引用,先让i + 1,后在i所在的表达式中使用i的新值。

    number = ++i;  等价于:  i = i + 1; number = i;

2> i++是先使用后增加,先让i所在的表达式使用i的值,后让i + 1。

    number = i++;  等价于:temp = i; number = temp; i = temp +1;

4.++i 和 i++ 的使用实例分析。

最后输出的a和b的值分析。


#include <stdio.h>

int main(int argc, const char * argv[]) {

    int  a,b;

    for (a = 0, b = 0; a < 5; a++) {

        b += a++;

    }

    printf("a = %d\nb = %d\n",a,b);

    return 0;

}

  1> 首先先来明确一个观点:a++是先使用再加1,而++a是先加1后再操作。因此,顺序的读程序,开始进入for循环。
  2> 第一次进入时a的初始值是0,b的初始值也是0。这时的a++并没有在本次语句中起到加1的作用,而是要在本次操作结束后再起作用,也就是在第一次循环完全结束后。进入循环体看,b += a++;这时由于这里的是a++(需要先操作后加1),所以,b的值理所当然是0了,而在本句结束后a的值就进行了加1操作,在本次循环结束时又进行了一次加1操作,所以本次循环结束后a=2,b=0。
  3> 第二次进入时a的初始值是2,b的初始值是0。同理分析,在b += a++;后b的值为2了,而a的值也由于两次a++变为了4。所以,本次循环结束后a=4,b=2。
  4> 第三次进入时a的初始值是4,b的初始值是2。同理分析,在b += a++;后b的值由于经过原来的值与i当前的值相加后变成了6,而a的值同样是在最后加了两个1。所以在本次循环结束后a=6,b=6。
  5> 第四次准备进入循环时,发现a的值已经比5大了。因此,程序终止。最后a的值为6,b的值也为6。


5.常见使用易错分析。

1> 在使用后缀形式的++和--时,(后缀形式:i++,i--)何时执行自增或自减操作?

    C语言标准引入了“顺序点”的概念,并且指出“应该在前一个顺序点和下一个顺序点之间对存储的操作数的值进行更新”。在C语言中有多种不同类型的顺序点,表达式语句的末尾是其中的一种,在表达式语句的末尾,该语句中的所有自增和自减操作都必须执行完毕,否则不能进入下一条语句。(例:number = i++; 这句代码  要先执行完:temp = i; number = temp; i = temp +1; 才会执行下一句代码。)

2>自增运算符不能用于表达式。

例:如果a = 0;b = 0;计算(a + b)++ 这个表达式的值。

  举个例子让你理解这个题目 假设a = 1,b = 2;那么(a + b)之后等于3,因此3是一个常量,不再是变量,因此是错误的,也就是说++是不能对常量进行操作的,也就是不能这样使用5++。

  其次,a++是与a = a + 1是等效的,也就是说执行a++后,变量a的值本来是1,但执行后就变为2了,而常量的值是不能改变的,也就是说执行5++之后,不可能把5变为6,因此常量不能使用++运算符操作。

  所以,在这里不能用 j = ++i++ 来判断前缀++和后缀++的优先级是错误的,因为不管是前缀++还是后缀++的优先级高,总有一个是对表达式操作的,也就是对常量操作的。


版权声明:本文为博主原创文章,未经博主允许不得转载。

C++中的++i和i++

最近虽然比较忙,也有点压力,不过相对还是闲的时间多,花了些时间看了些书。 还是感觉要写点什么,就从这里开始吧。 写在前面:--i和i-- 与 ++i和i++ 相似,这里仅讨论后者。 一、对于内...
  • qq_35154908
  • qq_35154908
  • 2016年10月19日 10:52
  • 823

C语言++i和i++

解释说明++i和i++的区别 ++i表示取i的地址,增加它的内容,然后把值装入寄存器中 i++表示取i的地址,把它的值装入寄存器中,然后增加内存中i的值...
  • dawter
  • dawter
  • 2016年08月06日 00:37
  • 289

i++和++i 和i+1的区别

大家对i++和++i肯定很熟悉,但是不理解其中深层次原因,就很难理解为什么(i+1)和(i++)会差这么多? 测试代码: 第一种:i+1      结论: 1 2 3 4 5 public cla...
  • code_7
  • code_7
  • 2015年05月21日 18:45
  • 1823

关于i++与++i的思考

笔者刚接触这个的时候, 也是糊里糊涂,特意去查找了许多资料,自以为已经了解,不想仍是只在此山中,云深不知处。         通常的解释是:i++先运算,再自增;                 ...
  • qq_25186987
  • qq_25186987
  • 2016年11月22日 21:03
  • 139

i++ 你懂了么

i++ 请看入下代码( C ): #includeint main(void) { int a,x; for ( a = 0 , x = 0; a
  • baidu_33725271
  • baidu_33725271
  • 2017年04月21日 11:34
  • 76

i = i++, i = ++i, j = i++, j = ++i 的区别

题目来源牛客网上面练习的一道题目: 检查程序,是否存在问题,如果存在指出问题所在,如果不存在,说明输出结果。 package algorithms.com.guan.javajicu; pub...
  • u010339647
  • u010339647
  • 2016年08月30日 17:38
  • 2271

机器学习(Machine Learning)&深度学习(Deep Learning)资料(Chapter 1)

《Brief History of Machine Learning》 介绍:这是一篇介绍机器学习历史的文章,介绍很全面,从感知机、神经网络、决策树、SVM、Adaboost到随机森林、Deep L...
  • fishmai
  • fishmai
  • 2016年11月29日 16:12
  • 5219

java中i++ 与 i=i++的区别

记得大学刚开始学C语言时,老师就说:自增有两种形式,分别是i++与++i,i++表示的是先赋值后加1,++i是先加1后赋值。...
  • wangmaohong0717
  • wangmaohong0717
  • 2017年02月04日 17:32
  • 987

我所理解的i++和++i

我对i++和++i的深入理解
  • android_cai_niao
  • android_cai_niao
  • 2015年01月07日 12:23
  • 1111

浅谈java之++i和i++区别

浅谈java之++i和i++区别                   今天简单谈谈关于java的一个误区,相信很多刚开始学习java的朋友都会遇到这个问题,虽然问题很简单,但是经常容易搞混,说说jav...
  • u011747761
  • u011747761
  • 2015年01月09日 16:31
  • 10841
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:++i 和 i++ 的理解
举报原因:
原因补充:

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