概述
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. web-never give up

    打开题目连接 ?id=1 ,疑是注入点 但是输入其他数字无果 打开源码,发现注释有网页链接 打开连接123.206.87.240:8006/test/1p.html 发现回到了bugku的论坛首页,应 ...

  2. json.loads() json解码

    有些json数据里面套着json    一次json.loads()后还是会有数据是json格式 { "result": { "error_code": 0, ...

  3. luoguP3346 [ZJOI2015]诸神眷顾的幻想乡

    题意 学习了广义后缀自动机. 广义后缀自动机与普通后缀自动机的区别在于它是对多个串建的,于是可以处理多个串. 广义后缀自动机和普通后缀自动机的区别在于两个特判,可以见这篇题解 对于这题,因为叶子数量小 ...

  4. Linux学习笔记-第10天 特殊的交换分区

    关键词,分区.mkswap swapon .uquota,RAID,/etc/fstab 此章开始,难度有些提升.不过还好自己有点基础.

  5. Paper | Model-blind video denoising via frame-to-frame training

    目录 故事 本文方法 流程 训练 实验 发表在2019年CVPR. 核心内容:基于Noise2Noise思想,这篇文章致力于无监督的视频盲去噪:是的,连噪声样本都不需要了. 这篇文章写作和概括太棒了! ...

  6. Linux应试技巧

    前言:此文是为了CSP-S第二轮认证所用系统NOI-Linux的写的,但其他的Linux系统也可以按照相同或类似的方法进行配置. 配置NOI-Linux 我大约是一个月以前由于比赛的原因才开始接触NO ...

  7. (二十二)golang--时间和日期相关函数

    时间的常量,可以获得指定时间单位 Unix和UnixNano   小例子:统计函数运行的时间:

  8. Vue.js 源码分析(二十五) 高级应用 插槽 详解

    我们定义一个组件的时候,可以在组件的某个节点内预留一个位置,当父组件调用该组件的时候可以指定该位置具体的内容,这就是插槽的用法,子组件模板可以通过slot标签(插槽)规定对应的内容放置在哪里,比如: ...

  9. TiDB 压力测试报告

    (转载自公众号DBATech) 一.测试环境 1.tidb 集群架构: 测试使用最基本的TiDB架构.即 3个tidb-server节点+ 3个tikv节点 + 3个pd节点. 2.tidb集群的部署 ...

  10. C 函数指针、回调函数

    参考链接:https://www.runoob.com/cprogramming/c-fun-pointer-callback.html 函数指针 函数指针就是执行函数的指针,他可以像正常函数一样去调 ...