学编程,来源栈;先学习,再交钱
当前系列: 编程语言 修改讲义

赋值运算

赋值本质上也是一种运算。运算所使用的符号叫做运算符,所以等号(=)也是一种运算符(operator)

右连接

赋值运算符是连接的:即在一个表达式中,运算是从右到左进行的。比如:

    int a, b, c;
    a = b = c = 50;

运算顺序是:

  1. 把50赋值给c
  2. 把c的值赋值给b
  3. 把b的值赋值给a

接下来讲的运算符大多数都是连接的。

其他常见的运算大致包括:


数值运算

比如加减乘除,其符号分别是+-*/:
32 + 3; 
fee - 1;
2 * pai;
16.5 / 5;

还有我们前面所说的取余,运算符是百分号(%):

7%2   //结果为余数1

这种运算代码被称之为表达式

意外惊喜

@试一试@:0.1+0.2,结果是多少?

这不是bug,是计算机进行小数运算时很难解决的问题。

简单的解释是:计算机在把十进制的0.1或0.2转换成二进制时丢失了“精度(precision)”,就好像我们在把1/3转换成0.333333333333333333时丢失了一点点数据一样。


运算后赋值

这里有一种初学者可能有点奇怪的写法:

fee = fee + 10;
这一行的代码,意思是:
  1. 在fee的基础上加10
  2. 然后将运算结果再赋值给fee

所以实际上的结果是fee的值增加了10。

这种可以被简写成:

fee += 10;

加减乘除都可以这样组合,比如:减等于(-=)、乘等于(*=)、除等于(/=)……

如果只是加/减(乘除不行)1的话,还可以被进一步简写成:

fee++;    //右加加
++fee;    //左加加
fee--;    //右减减
--fee;    //左减减


#常见面试题#:左右加加区别是什么?^_^

为了说明这个问题,我们引入:

alert(fee++);   //先console.log(),再++
alert(++fee);   //先++,在console.log()

很坑,有时候阴沟里翻船……(历史遗留问题,不够优雅)


运算符优先级

3+2-5*0  //结果是什么?
回答0的同学:面壁,深刻反省,小学数学体育老师教的?

先乘除,后加减:这就是优先级(priority)。一个表达式里面有多个运算符,按优先级从高到低依次运算。

但是,飞哥推荐优先使用圆括号((),注意:没有中括号[],中括号在编程语言中有其他含义),提高代码的可读性。圆括号具有最高优先级,总是会被首先计算,比如:

    alert((3 + 2 - 5) * 0);  // 结果是0

PS:牛逼的代码,是别人读不懂的代码,而是别人能读懂的代码!千万千万不要搞反了。

代码让人读不懂,是坑人!会被打的。


逻辑运算

典型的就是比较运算:

fee > 18;    //大于
fee < 18;    //小于
fee <= 18;    //小于等于,≤
fee >= 18;    //大于等于,≥

score == 0;   //等于,注意是两个等号
token != '飞哥最帅'   //不等于

返回的值被称之为布尔(bool)值,又是一种数据类型,包括:真(true)和假(false)

bool值之间还可以进行计算,包括:

  • 且(&&):两个条件必须同时满足才为真,比如丈母娘要求:有车有房
  • 或(||):两个条件满足一个即为真,比如:计算机或相关专业本科以上学历
  • 取反(!):真取反为假,假取反为真

演示:true || false,true && true,!true

逻辑预算可以一直连缀,产生比较复杂的表达式:

//假设fee=101
fee > 80 || fee < 100 && fee%2==0
(fee > 80 || fee < 100) && fee%2==0    //加圆括号修改优先级
(fee > 80 || fee < 100) && !fee%2==0    //还加上了取反

演示:优先级 ! > && > ||,建议:

  • 充分利用圆括号,提高代码可读性
  • 避免太过于复杂的逻辑运算表达式,方法后文详述


#常见面试题#:和位运算的区别

实际上,还有两个运算符:按位或(|)和按位与(&),和逻辑运算符很类似,而且作用也类似:

    alert(true | false);   //结果为true
    alert(true & false);   //结果为false

既然这样的话,这种位运算和逻辑运算又什么区别呢?

首先,位运算本质上是在二进制上运算的,它可以把bool值都先转换成二进制,把1当成true,0当成false,按逻辑或/且进行运算

  • |:只要有一个1,运算结果为1;
  • &:只要有一个0,运算结果为0;

学习完函数之后再演示:短路运算


妙用位运算

在软件开发中,如何存储一个用户的权限/角色,也是一个比较麻烦的事情。

源栈的学生,可以是:

  • 学生(Student),还可以是
  • 老师助理(TeacherAssist),以及
  • 小组长(TeamLeader)和
  • 寝室长(DormitoryHead)

每个同学可以是上面一种或多种角色,而且可以随时增减。

让你来记录同学的角色,你怎么办?一种更“专业”更有“逼格”的方法是:使用2的整数次方的数值代表角色,对他们进行位运算,完成权限的增、删、查:

十进制
二进制
权限/角色
1
0001
Student
2
0010
TeacherAssist
4
0100
TeamLeader
8
1000
DormitoryHead

规律

@想一想@,这可以用来干嘛?

当所有参与运算成员的数值都是:

  • 2的整数次方,或者
  • 2的整数次方数之和,比如3(=1+2)、6(=2+4)、7(=1+2+4)……

他们就会有如下规律:

  • 位或(|)相当于“加”,比如:2|4=6,2|4|1=7……,以下我们将位或(相加)的结果简称为“位或结果”,参与位或运算的成员简称为“成员”,未参与运算的称之为“非成员”
  • 将位或结果和任一成员进行位与(&)运算,其结果就等于该成员,比如:6&2=2,7&4=4;且与任何非成进行位与(&)运算,其结果不会等于该非成员,比如:6&1=0,7&8=0
  • 将位或结果和其中任一成员进行异或(^,两个都相同为0,否则为1)运算,其效果就相当于“减”,比如:6^2=4,7^4=3,

所以,@想一想@:这是不是就是天然的权限管理方案啊?以下current表示当前所有权限

  • 增加一个权限(new):位或,current | new
  • 减少一个权限(old):位与,current ^ old
  • 检查有无权限(has):位与之后比较,(current & has) == has
注意:运算之前先检查,不能重复运算,比如没有某权限的时候再删除某权限,这就坏事了……


字符串运算

通常,都会提供一个字符串的拼接运算。字符串用引号包裹,所以,"32"和32是不一样的。

转义

@想一想@:假如我们的字符串中包含了引号怎么办?比如:"大"神"小"班。

如果我们这样写:

let slagon = ""大"神"小"班"";
是会直接报错的。因为计算机搞不懂这里面的引号("")那些是定义字符串的,哪些是字符串中本身包含的。

这时候我们需要由反斜杠(\)引导的转义字符:

let slagon = "\"大\"神\"小\"班\"";

\" 就意味着一个作为字符串内容的双引号。

\后面还可以跟其他字符,代表不同的意思,常见的有:

  • \\:一个反斜杠
  • \r\n:换行

拼接和比较

运算符也是加号(+):

greet = "源栈欢迎你," + "阿泰";

+可以被多次使用,拼接多个字符串。

@试一试@:将字符串和数值进行加号运算,会有什么结果?

最后,字符串也可以进行比较:

"abc" == "ABC"
"abc" != "ABC"


作业

  1. 写一段代码,能根据半径获取圆的周长(=2倍半径乘以圆周率)和面积(=半径的平方乘以圆周率)
    1. 声明一个变量radius,代表半径,给它赋一个任意值;
    2. 使用alert(/*这里放表达式*/)输出周长;
    3. 使用alert(/*这里放表达式*/)输出面积;
  2. 声明一个变量number,给number赋整数值,写出以下表达式,判断number是不是:
    1. 正数,示例:
      number>0
    2. 大于100的正数
    3. 大于100小于1000的正数
    4. 10000以内能被3整除的奇数
  3. 声明变量sname(学生姓名),将你的名字(比如:阿泰)赋值给它;然后利用它输出入栈口号,比如:我是阿泰,学业不成,誓不出栈!
学习笔记
源栈学历
键盘敲烂,月薪过万作业不做,等于没学

作业

觉得很 ,不要忘记分享哟!

任何问题,都可以直接加 QQ群:273534701

在当前系列 编程语言 中继续学习:

多快好省!前端后端,线上线下,名师精讲

  • 先学习,后付费;
  • 不满意,不要钱。
  • 编程培训班,我就选源栈

更多了解 加:

QQ群:273534701

答疑解惑,远程debug……

B站 源栈-小九 的直播间

写代码要保持微笑 (๑•̀ㅂ•́)و✧

公众号:源栈一起帮

二维码