++i 和 i++ 的理解

时间:2022-12-23 17:24:13

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

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

2.运算符优先级表格:

++i 和 i++ 的理解


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++ 来判断前缀++和后缀++的优先级是错误的,因为不管是前缀++还是后缀++的优先级高,总有一个是对表达式操作的,也就是对常量操作的。