第3章 使用判断语句

3.1 使用布尔操作符

布尔操作符是求值为true或false的操作符。

C#提供了几个非常有用的布尔操作符,其中最简单的是NOT(求反)操作符,它用感叹号(!)表示。!操作符求布尔值的反值。

例如:

bool areYouReady;

areYouReady=true;

!areYouReady;//则为false

3.1.1 理解相等和关系操作符

两个常用的布尔操作符是相等(==)和不等(!=)操作符。

这两个二元操作符判断一个值是否与相同类型的另一个值相等,结果是bool值。如下表:

操作符

含义

示例

结果(假定age=42)

==

等于

age==100

false

!=

不等于

age!=0

true

注意:不要混淆相等操作符(==)和赋值操作符(=)。

与==和!=密切相关的是关系操作符,它们判断一个值是小于还是大于同类型的另一个值。

如下表:

操作符

含义

示例

结果(假定age=42)

<

小于

age<21

false

<=

小于或等于

age<=18

false

>

大于

age>16

true

>=

大于或等于

age>=30

true

3.1.2 理解条件逻辑操作符

C#还提供了另两个布尔操作符:逻辑AND(逻辑与)操作符(用&&表示)和逻辑OR(逻辑或)操作符(用||表示)。这两个操作符统称条件逻辑操作符,作用是将两个布尔表达式或值合并成一个布尔结果。

这两个二元操作符与相等/关系操作符相似的地方是结果也为true或false。

不同的地方是操作的值(操作数)本身必须是true或false。

例如下:

bool validPercentage;

int percent=99;

validPercentage=(percent>=0) &&(percent<=100);//返回值为true

3.1.3 短路求值

操作符&&和||都支持短路求值

有时没必要两个操作数都求值,例如,假定操作符&&的左操作数求值为false,整个表达式的结果肯定是false,无论右操作数的值是什么。

注意:如果能精心设计使用条件逻辑操作符的表达式,就可避免不必要的工作以提升代码性能。将容易计算、简单的布尔表达式放到条件逻辑操作符左边,将复杂的放到右边。许多情况下,程序并不需要对更复杂的表达式进行求值。

3.1.4 操作符的优先级和结合性总结

下表总结了迄今为止学过的所有操作符的优先级和结合性。同一类别的操作符具有相同优先级。各类别按优先级从高到低排列。

类别

操作符

描述

结合性

主要(Primary)

()

覆盖优先级

++

后递增

--

后递减

一元(Unary)

!

逻辑NOT

+

-

++

前递增

--

前递减

乘(Multiplicative)

*

/

%

求余(取模)

加(Additive)

+

-

关系(Relational)

<

小于

<=

小于或等于

>

大于

>=

大于或等于

相等(Equality)

==

等于

!=

不等于

条件AND

(Conditional AND)

&&

逻辑AND

条件OR

(Conditional OR)

||

逻辑OR

赋值(Assignment)

=

3.2 使用if语句做出判断

3.2.1 理解if语句的语法

if语句根据布尔表达式的结果选择执行两个不同的代码块

if语句的语法如下所示(ifelse是C#关键字):

if(booleanExpression)

statement -1;

else

statement -2;

3.2.2 使用代码块分组语句

在前面的if语法中,if(booleanExpression)后面只有一个语句,关键字else后面也只有一个语句。但经常要在布尔表达式为true的前提下执行两个或更多语句。这时可将要运行的语句分组到新方法中,然后调用方法。但更简单的做法是将语句分组到代码块中。

代码块是用大括号封闭的一组语句。

如下例两个语句将seconds重置为0,并使minutes递增。这两个语句被放到代码块中。如果seconds的值等于59,整个代码块都会执行:

int seconds=0;

intminutes=0;

if(seconds==59)

{

seconds=0;

minutes++;

}

else

{

seconds++;

}

注意:遗漏大括号造成两个严重后果。首先,C#编译器只将第一个语句(seconds=0;)与if语句关联,下一个语句(minutes++;)不再成为if语句的一部分。其次,当编译器遇到else关键字时,不会将它与前一个if语句关联,所以会报告一个语法错误。因此,一个好习惯是用代码块定义if语句的每个分支,即使其中只包含一个语句。这样一来,以后添加代码会更省心。

(这个不好的习惯我也有犯,因为在只用写一句代码结果的时候我就偷懒没有加上大括号,要改正。。。)

3.2.3 嵌套if语句

可在一个if语句中嵌套其它if语句。这样可以链接一系列布尔表达式。它们依次测试,直至其中一个求值为true。

在下例中,假如day值为0,则第一个测试的值为true,值‘Sunday’将被赋给dayName变量。假如day值不为0,则第一个测试失败,控制传递给else子句。该子句运行第二个if语句,将day的值与1进行比较。

注意:只有第一个if测试为false,才执行第二个if语句。类似地,只有第一个if测试和第二个if测试为false,才执行第三个if。

if(day==0)

{

dayName=”Sunday”;

}

else if(day==1)

{

dayName=”Monday”;

}

else

{

dayName=”unKnown”;

}

3.3 使用switch语句

3.3.1 理解switch语句的语法

switch语句语法如下(switchcasedefault是C#关键字):

switch(controllingExpression)

{

case controllingExpression:

statements

break;

case controllingExpression:

statements

break;

default:

statements

break;

}

注意:每个controllingExpression值都必须唯一,使controllingExpression只能与它们当中的每一个匹配。如果controllingExpression的值和任何controllingExpression的值都不匹配,也没有default标签,程序就从switch的结束大括号之后的第一个语句继续执行。

例如,前面的嵌套if语句可改成switch语句:

switch(day)

{

case 0:

dayName=”Sunday”;

break;

case 1:

dayName=”Monday”;

break;

default:

dayName=”unKnown”;

break;

}

3.3.2 遵守switch语句的规则

switch语句很有用,但使用须谨慎。

switch语句要严格遵循以下规则:

  • switch语句的控制表达式只能是某个整型(int,char,long等)或string。其它任何类型(包括float和double类型)只能用if语句。
  • case标签必须是常量表达式,如42(控制表达式是int),‘4’(控制表达式是char)或“42”(控制表达式是string)。要在运行时计算case标签的值,必须使用if语句。
  • case标签必须唯一,不允许两个case标签具有相同的值。
  • 可以连续写多个case标签(中间不插额外语句),指定在多种情况下都运行相同的语句。如果像以下这样写,最后一个case标签之后的代码将适用于所有case。但假如两个标签之间有额外的代码,就不能从第一个标签贯穿(也称直通)到第二个标签,编译器会报错。例如:

switch(trumps)

{

case Hearts;

case Diamonds: //允许直通——标签之间无额外代码

Color=”Red”; //Hearts和Diamonds两种情况都执行相同的代码

break;

case Clubs:

Color=”Black”;

case Spades:  //出错——标签之间有额外代码

Color=”Black”;

break;

}

注意:break语句是阻止直通的最常见方式,也可用return或throw语句代替。return从switch语句所在的方法退出,throw抛出异常并中止switch语句。

switch语句的直通规则:

如果间插了额外语句,就不能从一个case直通到下个case,这样就可以自由安排switch语句的各个区域,不用担心会改变其含义(就连default标签都能随意摆放;它通常放在最后,但并非必须)。

《Visual C# 从入门到精通》第三章使用判断语句——读书笔记的更多相关文章

  1. 《Visual C# 从入门到精通》第二章方法和作用域——读书笔记

    第2章 方法和作用域 2.1创建方法 方法是一个基本的,强大的编程机制.可视为函数或者子程序相似的东西. 方法名是个有意义的标识符. 方法主体包含方法被调用时实际执行的语句. 声明一个方法的实例如下: ...

  2. 《Visual C# 从入门到精通》第一章使用变量、操作符和表达式——读书笔记

    前言: 这个笔记是我个人总结,主要是熟练自己查看<Visual C# 从入门到精通>(第8版)这本书时,懵然起总结的想法,只是总结一些知识点,在工作项目会用得上,但是对毫无C#语言基础的, ...

  3. 《Java并发编程实战》第三章 对象的共享 读书笔记

    一.可见性 什么是可见性? Java线程安全须要防止某个线程正在使用对象状态而还有一个线程在同一时候改动该状态,并且须要确保当一个线程改动了对象的状态后,其它线程能够看到发生的状态变化. 后者就是可见 ...

  4. SaltStack 入门到精通第三篇:Salt-Minion配置文件详解

    SaltStack 入门到精通第三篇:Salt-Minion配置文件详解 作者:ArlenJ  发布日期:2014-06-09 17:52:16   ##### 主要配置设置 ##### 配置 默认值 ...

  5. 《Visual C++ 2010入门教程》系列三:关于C++的一些问题

    <Visual C++ 2010入门教程>系列三:关于C++的一些问题   这一回我自己都不知道应该写点什么好,或许今天的篇幅会比往常短很多.我说过,这不是C++的教程,因为我还没有那个能 ...

  6. GPU 编程入门到精通(三)之 第一个 GPU 程序

    博主因为工作其中的须要.開始学习 GPU 上面的编程,主要涉及到的是基于 GPU 的深度学习方面的知识,鉴于之前没有接触过 GPU 编程,因此在这里特地学习一下 GPU 上面的编程.有志同道合的小伙伴 ...

  7. MyBatis从入门到精通(第5章):MyBatis代码生成器

    jdk1.8.MyBatis3.4.6.MySQL数据库5.6.45.Eclipse Version: 2019-12 M2 (4.14.0) MyBatis从入门到精通(第5章):MyBatis代码 ...

  8. ArcGIS for Desktop入门教程_第三章_Desktop软件安装 - ArcGIS知乎-新一代ArcGIS问答社区

    原文:ArcGIS for Desktop入门教程_第三章_Desktop软件安装 - ArcGIS知乎-新一代ArcGIS问答社区 1 软件安装 1.1 安装前准备 请确认已经收到来自Esri中国( ...

  9. D3.js的v5版本入门教程(第三章)—— 选择元素和绑定数据

    D3.js的v5版本入门教程(第三章) 在D3.js中,选择元素和绑定元素是最基本的内容,也是很重要的内容,等你看完整个教程后你会发现,这些D3.js教程都是在选择元素和绑定元素的基础上展开后续工作的 ...

随机推荐

  1. call()的个人理解

    先看两道道面试题 面试题1: var number = 50; var obj = { number: 60, getNum: function() { var number = 70; return ...

  2. sql中join与left-join图解区别

      select a.* from YG_BRSYK a left join(SELECT DISTINCT SYXH, STUFF((SELECT '.'+MS FROM #lsb where SY ...

  3. [Day8] eclipse

    快捷键 1.内容辅助键  Alt+/ 2.格式化Ctrl+Shift+f 代码区域右键 -- Source – Format 3. 自动导包: Ctrl+Shift+o 如果当前类在多个包中都存在,这 ...

  4. 把vim改装为source sight

    本文在ubuntu18.04上实践. 主要为VIM 安装4个插件: taglist,srcexpl,NERD_tree,ctrlp 1,taglist.vim :https://www.vim.org ...

  5. [ssh] 通过ssh私钥生成公钥的方法

    ssh-keygen -y -f .ssh/id_rsa.key id_rsa.key是私钥.

  6. IntelliJ IDEA 下的svn配置及使用

    首先,使用的时候,自己得先在电脑上安装个小乌龟.也就是svn啦. 第一步安装小乌龟. 如下: 具体安装好像没什么具体要求,一路next,就好. 如上图箭头所示,在安装 TortoiseSVN 的时候, ...

  7. 转载:Linux下解压zip乱码问题的解决(unzip)

    https://blog.csdn.net/abyjun/article/details/48344379 在windows上压缩的文件,是以系统默认编码中文来压缩文件.由于zip文件中没有声明其编码 ...

  8. com.mysql.jdbc.Driver 与 org.gjt.mm.mysql.Driver的区别

    com.mysql.jdbc.Driver的前身是org.gjt.mm.mysql.Driver,现在主要用com.mysql.jdbc.Driver,但为了保持兼容性保留了org.gjt.mm.my ...

  9. JDK 1.8源码阅读 LinkList

    一,前言 LinkedList是一个实现了List接口和Deque接口的双端链表.有关索引的操作可能从链表头开始遍历到链表尾部,也可能从尾部遍历到链表头部,这取决于看索引更靠近哪一端. LinkedL ...

  10. JAVA设计模式之静态代理

    首先看看什么是代理模式. 一 代理模式 使用一个代理对象将对象包装起来,然后用该代理对象来取代该对象,任何对原始对象的调用都要通过代理,代理对象决定是否以及何时调用原始对象的方法 二 静态模式 要求被 ...