++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的区别及运行效率

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

C#中的i++和++i

刚刚学习C#的时候,难免会遇到一些麻烦,而我觉得最有意思的是i++和++i。 先介绍下它们吧!!i++ 俗称后加加:在处理运算的时候先不做运算,等输出的时候再加,这是我个人的理解。 ++i 俗称先加加...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

java中的i++和++i

i++和++i的区别1、i++和++i各自的含义i++:代表程序执行完以后在进行赋值操作 ++i:代表先进行赋值然后在进行程序操作 比如下面最简单的例子:int x=3; int y=5; int...

【LeetCode26】【Remove Duplicates from Sorted Array】

题目: Given a sorted array, remove the duplicates in place such that each element appear only once and...

从JAVA字节码看++i 和i++ 的区别

记录一下,省的面试的时候问到,虽然小儿科。 代码如下:public class TestDizeng { public static void main(String[] args) { /...

【朝花夕拾】【编程基础】五 i++/-- 与 ++/--i

【朝花夕拾】【计算机基础】 五 i++/– 与 ++/–i先用,在操作 . 先操作,在用 . i++/- - 先使用i的值,在进行+/-1操作 ++/- -i 先进行+1操作,在使用i的值 下...

i++ , ++i 的区别

困惑新手的++(--)运算符,很多老师都会这么说,++在前就先加后运算 ,++在后就先运算,再自增1, 国类大学C接触的也多半是谭XX教授编写的(反正当时我们是这样的),在书里经常搞来搞去,搞一堆运算...

Java中i++和++i的区别

说来惭愧,从事开发工作也有一年时间了,然而在今天的一个业务逻辑里突然发现原来我对i++和++i都没有理解,或者说我之前的理解是错误的。这对于一个有追求的程序猿是不能容忍的。知道之后,迅速恶补学习,现在...

++i 和 i++ 的理解

C语言初学者易理解错误的自增运算符

i=i++问题

看下面一道面试题package Test01;public class Demo02 { public static void main(String[] args) { De...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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