多的人,花少的钱,用高的效率,学多的知识,早日实现 职业自由
面向过程-2:数据类型和运算:数值 / 逻辑 / 位 / 字符串 / 优先级

当前系列: 编程语言 修改

B站视频地址


赋值运算

赋值本质上也是一种运算。运算所使用的符号叫做运算符,所以等号(=)也是一种运算符(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转换成二进制时丢失了“精度”,就好像我们在把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的同学:面壁,深刻反省,小学数学体育老师教的?

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

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

    Console.WriteLine((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    //还加上了取反

建议:

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


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

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

    Console.WriteLine(true | false);   //结果为true
    Console.WriteLine(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是不一样的。

转义

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

如果我们这样写:

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

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

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

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

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

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

拼接和比较

运算符也是加号(+):

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

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

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

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

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


作业

  1. 电脑计算并输出:[(23+7)x12-8]÷6的结果
  2. 写一段代码,能根据半径获取圆的周长(=2倍半径乘以圆周率)和面积(=半径的平方乘以圆周率)
    1. 声明一个变量radius,代表半径,给它赋一个任意值;
    2. 使用alert(/*这里放表达式*/)输出周长;
    3. 使用alert(/*这里放表达式*/)输出面积;
  3. 声明一个变量number,给number赋整数值,写出以下表达式,判断number是不是:
    1. 正数,示例:
      number>0
    2. 大于100的正数
    3. 大于100小于1000的正数
    4. 10000以内能被3整除的奇数
  4. 想一想如下表达式的结果是什么,并说明原因:
        int a = 10;
        Console.WriteLine(a > 9 && (!(a < 11) || a > 10));
  5. 当a为何值时,结果为true?
    bool result = (a + 3 > 12) && a < 3.14 * 4 && a != 11;
  6. 声明变量sname(学生姓名),将你的名字(比如:阿泰)赋值给它;然后利用它输出入栈口号,比如:我是阿泰,学业不成,誓不出栈!
C# 语法基础 分支
觉得很 ,不要忘记分享哟!

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

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

我们的 特色

  • 面向就业
  • 线上线下结合
  • 同学互助
  • 师生共赢

报班 QQ群:273534701

  • 获取视频资料
  • 要求作业点评
  • 参加阶段性测试
  • 模拟面试