i++和++1
概述:
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
随机推荐
- [C6] Andrew Ng - Convolutional Neural Networks
About this Course This course will teach you how to build convolutional neural networks and apply it ...
- sql 以某个字段分组,另一个字段为参加比较的列,取得前n项的值
假设表A有三个字段 { id int: subject varchar(20): socre int: } 语句为 select * from A x where (select count(*) ...
- angular6.x 引入echarts
因为angular2+ 使用 ==typescript==开发,所以想要使用echarts,必须安装echarts针对angular的插件ngx-echarts.本文案列实际效果如上图. 安装ngx- ...
- MongoTemplate 分组分页复合条件查询
一.前言 最近项目使用MongoDB作为数据主要存取的地方 又是第一次接触MongoDB,也是踩了不少坑... 维护数据无非就是增删改查,而里面最复杂的就是查询了 所以来总结一下有关MongoDB的查 ...
- Paper | Making a "Completely Blind" Image Quality Analyzer
目录 1. 技术细节 1.1 NSS特征 1.2 选择锐利块来计算NSS 1.3 一张图像得到36个特征 1.4 用MVG建模这36个特征 1.5 NIQE指标 2. 实验 质量评估大佬AC Bovi ...
- 【Java语言特性学习之六】扩展知识点
一.SPI机制 二.注解处理机制 三.java native关键字 https://www.cnblogs.com/KingIceMou/p/7239668.html
- 使用OpenSSL证书操作详解
一.OpenSSL简介 OpenSSL支持多种秘钥算法,包括RSA.DSA.ECDSA,RSA使用比较普遍.官网地址:https://www.openssl.org/,一般CeontOS系统都装有Op ...
- 腾讯微视:向前一步是悲壮,向后一步是绝望zz
“换做以往的任何一场战争,微博之战.搜索之战和电商之战——大量投入但始终不见效果,打到现在腾讯肯定已经交牌了.微视的不同之处在于,它有些悲壮,因为这是腾讯最不想交出的一张牌.” 文 | <财经& ...
- let/const特性
let: 1.声明的变量不存在预解析: console.log(a); let a=1; 2.变量名不允许重复(在同一作用域下): { let a=1; let a=2; console.lo ...
- Springboot2 Metrics之actuator集成influxdb, Grafana提供监控和报警
到目前为止,各种日志收集,统计监控开源组件数不胜数,即便如此还是会有很多人只是tail -f查看一下日志文件.随着容器化技术的成熟,日志和metrics度量统计已经不能仅仅靠tail -f来查看了,你 ...