概述
i++和++i 这个问题困扰了我很长时间,在这段时间里自己不止一次的怀疑自己的智商,难道自己对编程一点天赋都没有吗?此问题严重打击了我的自信心.......
也曾苦苦暗自琢磨,也曾百度谷歌疯狂搜索,得到答案都是一样的:“i++是先赋值,后运算;而++1是先运算,后赋值”,谁给谁赋值?谁和谁运算?越看越蒙。
直到今天,终于在一位老师的点拨下搞明白了。
我们要从两个不同的角度等待这个问题,第一个角度我称为“自己给自己玩”,第二个角度我称为“自己陪别人玩”
第一个角度:“自己给自己玩-------都是a=a+1的意思”
无论是i++还是++i,都是都是在原本的数值上加一的意思,如下面的两个例子:

[root@www ~]# i=2
[root@www ~]# let i++

#如上,上面的i++就相当于i=i+1,第一个i在没运算之前是没有值的,第二个i就是代表上面的2;在运算之后的结果就变成了i=3(2+1)了,所以下面的echo $i的值就是3

[root@www ~]# echo $i
3

---------------------------------------我是第一个角度下,i++和++i的分隔线---------------------------------------

[root@www ~]# i=3
[root@www ~]# let ++i

#如上,上面的++i也相当于i=i+1,第一个i在没运算之前是没有值的,第二个i就是代表上面的3;在运算之后的结果就变成了i=4(3+1)了,所以下面的echo $i的值就是4

[root@www ~]# echo $i
4

小结:
在第一个角度下,都是先赋值,再运算。也就是说先给第二个i赋值,然后进行运算,最后得出第一个i的值。
第二个角度:“自己陪别人玩---没那么简单,有了分别心,分别了先后”
这里的先后指的赋值和运算的先后,那么谁给谁赋值?谁为谁运算?先别急,慢慢来。
我们先要理解“自己给自己玩”是什么意思?所谓的自己给自己玩,就是自己拿自己“开刀”,在自己的基础上加加减减,对别人(别的变量)没有什么影响。就像i++和++i,都是围绕着$i,自己围绕着自己也翻不起什么风浪,不管是i++还是++i全是i=i+1的意思,并且在运算之前第一个i没有值,而第二个i是有值的,运算之后第一个i才是有值的。
而自己陪别人玩的意思就是通过自己给别的变量赋值,这样就没有那么简单了!
给别人赋值时,如果用i++的话,就得先把i原本的值赋给别人,然后再自己给自己运算,举个粟子:

[root@www ~]# i=2
[root@www ~]# let x=i++ # 变量i现在给变量x赋值,过程是这样的,i要先把自己的值(也就是2)赋给x,i原本是2,赋给x之后,x就变成了2,所以当你echo $x的时候就是2,不信你就看下一行!好,继续,x现在有值了,就先把x放一边,剩下的就是i++了,i++就是i=i+1的意思,就又回到了“自己给自己玩”,这样i就等于3了,不信你看下下行!
[root@www ~]# echo $x
2
[root@www ~]# echo $i
3

总结:i++先稳住别的变量,先给别的变量赋值,然后再自己给自己玩。
---------------------------------------我是第二个角度下,i++和++i的分隔线---------------------------------------
给别人赋值时,如果用++i的话,就得自己先给自己运算,然后把运算后的结果赋给别的变量,举个粟子

[root@www ~]# i=2
[root@www ~]# let x=++i #先是“自己给自己玩”,x在没有运算之前是没有值的,只有i有值(2),先看++i,我们可以得到i=3,而x在i运算之后就等于i的值,所以也等于3。
[root@www ~]# echo $x
3
3[root@www ~]# echo $i
3

  

随机推荐

  1. 面向对象程序设计(Java) 第7周学习指导及要求

    2019面向对象程序设计(Java)第7周学习指导及要求 (2019.10.11-2019.10.14) 学习目标 掌握四种访问权限修饰符的使用特点: 掌握Object类的用途及常用API: 掌握Ar ...

  2. middlewares.py

    1.数据需要selenium解析后才能呈现 # middlewares.py from scrapy import signals import scrapy from selenium import ...

  3. 4.web基础$_POST

  4. python27期尚哥讲TCP:

    TCP:传输控制协议(使用情况多于udp) 稳定:保证数据一定能收到 相对UDP会慢一点 web服务器一般都使用TCP(银行转账,稳定比快要重要)TCP通信模型: 在通信之前,必须先等待建立链接 TC ...

  5. JDOJ3007 铺地板I

    JDOJ3007 铺地板I https://neooj.com/oldoj/problem.php?id=3007 题目描述 有一个大小是 2 x N(1 <= N <= 105)的网格, ...

  6. C# Windows服务创建安装卸载

    一.创建Windows服务 使用VS创建一个新的windows服务应用程序 创建完成之后 二.相关配置 修改Service1名称为StartService(可以不改,自行选择) 添加安装程序并修改配置 ...

  7. 编程计算2×3阶矩阵A和3×2阶矩阵B之积C。 矩阵相乘的基本方法是: 矩阵A的第i行的所有元素同矩阵B第j列的元素对应相乘, 并把相乘的结果相加,最终得到的值就是矩阵C的第i行第j列的值。 要求: (1)从键盘分别输入矩阵A和B, 输出乘积矩阵C (2) **输入提示信息为: 输入矩阵A之前提示:"Input 2*3 matrix a:\n" 输入矩阵B之前提示

    编程计算2×3阶矩阵A和3×2阶矩阵B之积C. 矩阵相乘的基本方法是: 矩阵A的第i行的所有元素同矩阵B第j列的元素对应相乘, 并把相乘的结果相加,最终得到的值就是矩阵C的第i行第j列的值. 要求: ...

  8. python实现异步调用函数执行

    在实现异步调用之前我们先进行什么是同步调用和异步调用 同步:是指完成事务的逻辑,先执行第一个事务,如果阻塞了,会一直等待,直到这个事务完成,再执行第二个事务,顺序执行 异步:是和同步相对的,异步是指在 ...

  9. 不支持中国移动的N79频段,红米K30是假5G手机么?影响有多大?

    原文:https://mparticle.uc.cn/article.html?uc_param_str=frdnsnpfvecpntnwprdssskt&btifl=100&app= ...

  10. 数据仓库010 - MySQL查看所有存储过程,函数,视图,触发器

    .查询数据库中的存储过程和函数 方法一: select `name` from mysql.proc where db = 'your_db_name' and `type` = 'PROCEDURE ...