首页 > 其他分享 >第6章 分支语句和逻辑运算符

第6章 分支语句和逻辑运算符

时间:2022-08-29 23:33:14浏览次数:56  
标签:语句 逻辑 false 运算符 true 表达式

说明

看《C++ Primer Plus》时整理的学习笔记,部分内容完全摘抄自《C++ Primer Plus》(第6版)中文版,Stephen Prata 著,张海龙 袁国忠译,人民邮电出版社。只做学习记录用途。

目录

本章介绍分支语句条件运算符逻辑运算符

6.1 if 语句

6.1.1 if 语句

if语句的语法和while相似:

if (test-expression)
{
    statements;
}

和循环测试条件一样,if测试条件也将被强制转换为bool值,如果test-expression(测试条件)为true,则程序将执行statements(语句),如果测试条件为false,则程序将跳过语句。

通常将测试条件variable == value写为反转形式value == variable,用以捕获将相等运算符 == 误写为赋值运算符 = 的错误,例如将 x == 3写为 3 == x

6.1.2 if else 语句

if语句让程序决定是否执行特定的语句或语句块,而if else语句则让程序决定执行两条语句或语句块中的哪一条,if else语句的通用格式如下:

if (test-expression)
{
    statements1;
}
else
{
    statements2;
}

如果测试条件为true或非零,则程序将执行statements1,跳过statements2;如果测试条件为false或零,则程序将跳过statements1,执行statements2

6.1.3 多层 if else 结构

将一个if else包含于另一个if elseelse语句中,可得到多层条件分支语句,通常将其写为如下易于阅读的形式:

if (test-expression1)
{
    statements1;
}
else if (test-expression2)
{
    statements2;
}
else
{
    statements3;
}

如果测试条件test-expression1true或非零,则程序将执行statements1,跳过statements2statements3;如果测试条件test-expression1false或零且测试条件test-expression2true或非零,则程序将执行statements2,跳过statements1statements3;如果测试条件test-expression1test-expression2都为false或零,则程序将跳过statements1statements2执行statements3

6.2 逻辑运算符

C++ 提供了三种逻辑运算符,分别是逻辑 OR||)、逻辑 AND&&)和逻辑 NOT!)。

6.2.1 逻辑 OR 运算符:||

C++ 可以采用逻辑 OR 运算符(||)将两个表达式组合在一起,如果原来表达式中的任何一个或全部都为true(或非零),则得到的表达式的值为true,否则,表达式的值为false。C++ 规定,||运算符是个顺序点,其左边的子表达式优先于右边的子表达式,如果左侧的表达式为true,则 C++ 不会去判定右侧的表达式。expr1 || expr2的值如下表所示:

expr1 == true expr1 == false
expr2 == true true true
expr2 == false true false

6.2.2 逻辑 AND 运算符:&&

C++ 采用逻辑 AND 运算符(&&)将两个表达式组合在一起,当且仅当原来的两个表达式都为true(或非零)时,则得到的表达式的值为true,否则,表达式的值为false&&运算符是个也是个顺序点,其左边的子表达式优先于右边的子表达式,如果左侧的表达式为false,则 C++ 不会去判定右侧的表达式。expr1 && expr2的值如下表所示:

expr1 == true expr1 == false
expr2 == true true false
expr2 == false false false

逻辑 AND 运算符(&&)通常用于设置取值范围,例如:age >= 35 && age < 50

6.2.3 逻辑 NOT 运算符:!

逻辑 NOT 运算符(!)将它后面的表达式的真值取反。!expr的值如下表所示:

expr == true expr == false
false true

6.2.4 逻辑运算符的优先级以及另一种表示方式

C++ 逻辑 OR 和逻辑 AND 运算符的优先级都低于关系运算符,但逻辑 NOT 运算符的优先级高于所有关系运算符和算术运算符,逻辑 AND 运算符的优先级高于逻辑 OR 运算符。

//逻辑OR优先级低于关系运算符,以下两种方式等价
x > 5 || x < -5
(x > 5) || (x < -5)

//逻辑AND优先级低于关系运算符,以下两种方式等价
x > 5 && x < 10
(x > 5) && (x < 10)
    
//逻辑NOT优先级高于所有关系运算符和算术运算符,以下两种方式等价
!x > 5		//值总为false
(!x) > 5
    
//逻辑AND优先级高于逻辑OR,以下两种方式等价
age > 30 && age < 45 || weight > 300
(age > 30 && age < 45) || (weight > 300)

并不是所有的键盘都提供了用作逻辑运算符的符号,因此 C++ 标准提供了另一种表示方式(C++ 保留字),如下表所示。当 C 语言程序包含头文件 iso646.h后,也可以使用对应逻辑运算符的另一种表示方式。

运算符 另一种表示方式
`
&& and
! not

6.3 字符函数库 cctype

C++ 从 C 语言继承了一个与字符相关的、非常方便的函数库cctype,它可以简化诸如确定字符是否为大写字母、数字、标点符号等工作。例如,测试字符ch是否是字母字符有以下两种方式,但显然第二种方式更简洁:

//方式一:使用关系运算符以及逻辑运算符
if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'))

//方式二:使用cctype库中的isalpha()函数
if (isalpha(ch))

下表列出了cctype库中常用的函数:

函数名称 功能简述
isalnum() 若参数是字母或数字,返回true
isalpha() 若参数是字母,返回true
isdigit() 若参数是数字(0~9),返回true
iscntrl() 若参数是控制字符(在显示器上不占据打印位置),返回true
isprint() 若参数是打印字符(在显示器上占据打印位置),返回true
isgraph() 若参数是除空格之外的打印字符,返回true
islower() 若参数是小写字母,返回true
isupper() 若参数是大写字母,返回true
isxdigit() 若参数是十六进制数字(0~9, a~f, A~F),返回true
ispunct() 若参数是标点符号,返回true
isspace() 若参数是标准空白字符(空格' ',进纸'\f',换行符'\n',回车'\r',水平制表符'\t',垂直制表符'\v'),返回true
tolower() 若参数是大写字母,则返回其小写,否则返回该参数
toupper() 若参数是小写字母,则返回其大写,否则返回该参数

表中的isxxxxx()函数的返回类型为int,而不是bool,但通常自动bool转换能将它们视为bool类型。

6.4 条件运算符

条件运算符(?:)常被用来代替if else语句,它是 C++ 中唯一一个需要三个操作数的运算符,该运算符的通用格式如下:

//条件运算符写成的条件表达式
expression1 ? expression2 : expression3

如果expression1true,则整个条件表达式的值为expression2的值,否则,整个条件表达式的值为expression3的值。

//条件表达式应用实例:令c等于a,b中的最大值
int c = a > b ? a : b;

条件表达式可以嵌套使用,例如expression2expression3为另一个条件表达式。

6.5 switch 语句

相比于if else语句,C++ 的switch语句更适合多选择分支的结构。

//switch 语句的通用格式
switch (integer-expression)
{
    case label : statement(s)
    case labe2 : statement(s)
    case labe3 : statement(s)
    ...
    default    : statement(s)
}

执行到switch语句时,程序将跳到使用integer-expression值标记的那一行。因此,integer-expression必须是一个结果为整数值的表达式,另外,每个标签都必须是整数常量表达式。最常见的标签是intchar常量,也可以是枚举量。如果integer-expression不与任何标签匹配,则程序将跳到标签为default的那一行。default标签是可选的,如果其被省略,而又没有匹配的标签,则程序将跳出switch语句,执行switch语句后面的部分。

注意:程序跳到switch中特定代码行后,将依次执行之后的所有语句,包括其后所有标签对应的语句,除非有明确的其他指示(比如使用break跳出switch)。

6.6 break 和 continue 语句

breakcontinue语句都使程序能够跳过部分代码。可以在switch语句或任何循环中使用break语句,使用break语句后,程序将跳出switch语句或循环,如果break语句在多层循环的内部,则break将跳出包含它且离他最近的那一层循环。continue语句用于循环中,可以让程序跳过当前循环体中余下的代码,并开始新一轮循环。

//运行到break时,跳出while,执行statement3
while (cin.get(ch))
{
    statement1;
    if (ch == '\n')
        break;
    statement2;
}
statement3;

//运行到continue时,跳过剩余的statement2,进入while测试条件,开始新一轮循环
while (cin.get(ch))
{
    statement1;
    if (ch == '\n')
        continue;
    statement2;
}
statement3;

和 C 语言一样,C++ 也有 goto语句,但应尽量不使用使用goto语句。下面的语句将跳到使用paris:作为标签的位置:

//运行到goto时直接跳到指定标签处
char ch;
cin >> ch;
if (ch == 'P')
    goto paris;
statements;
paris: cout << "goto here!";

goto只能在函数体内跳转,不能跳到函数体外,goto多用于深度嵌套循环中一次性跳出多层内部循环,这是break无法做到的。

6.7 读取数字的循环

可以使用cin输入表达式的值来检测输入是不是数字,当程序发现用户输入了错误内容时,应按顺序采取 3 个步骤:

  1. 重置cin以接受新的输入。
  2. 删除错误输入。
  3. 提示用户再输入。
//通过输入初始化数组
const int MAX = 10;
int arr[MAX];
for (int i = 0; i < MAX; i++)
{
    cout << "输入第" << i+1 << "个数字:";
    while (!(cin >> arr[i]))
    {
        //重置cin
        cin.clear();
        
        //删除错误输入
        while (cin.get() != '\n')
            continue;
        
        //提示用户再输入
        cout << "请输入一个数字";
    }
}

6.8 简单文件输入/输出

文件读写需包含头文件fstream

6.8.1 写入到文本文件

//创建对象并关联文件
ofstream outFile;
outFile.open(filename);

//判断是否打开成功
if (!outFile.is_open())
{
    exit(EXIT_FAILURE);
}

//写入,类似cout用法
outFile << "Hello World";

//用完关闭
outFile.close();

其中的filename可以是一个字面字符串,还可以是存储在数组中的字符串(C-风格字符串)。

6.8.2 读取文本文件

//创建对象并关联文件
ifstream inFile;
inFile.open(filename);

//判断是否打开成功
if (!inFile.is_open())
{
    exit(EXIT_FAILURE);
}

//工具变量
double value;
double sum = 0.0;

//读取文件:方式一
while (inFile >> value)
{
    sum += value;
}

//读取文件:方式二
inFile >> value;
while (inFile.good())
{
    sum += value;
    inFile >> value;
}

//输出结果
cout << "sum = " << sum;

//确定停止读取的原因
if (inFile.eof())
    cout << "到达文件尾";
else if (inFile.fail())
    cout << "数据类型不匹配";
else
    cout << "未知原因";

//用完关闭
inFile.close();

标签:语句,逻辑,false,运算符,true,表达式
From: https://www.cnblogs.com/young520/p/16637822.html

相关文章

  • DOS if语句
    if"字符串1"=="字符串2"command语句#判断两个字符串是否相等if数值1equ数值2command语句#判断两个数值是否相等ifexistfilenamecommand语句......
  • 基本的mysql语句
    基本的mysql语句  本节课先对mysql的基本语法初体验。操作文件夹(库)增createdatabasedb1charsetutf8;查#查看当前创建的数据库showcreatedatabase......
  • EL表达式和EL运算符
    EL表达式1。概念:ExpressionLanguage表达式语言2.作用:替换和简化jsp页面中java代码的编写3,语法:$表达式}4,注意:"jsp默认支持el表达式的。如果要忽略el表达式1.设......
  • Go语言中的运算符
    ✍️介绍了Go中算术运算符,逻辑运算符,关系运算符等。这些是编程语言通用的,学到这,想起来大学时学c,vb和java的时光了。1.算术运算符1.1加、减、乘、除,取余var( a=1......
  • Codesys提升程序运行效率之AND_THEN、OR_ELSE运算符的使用
    之前看到有博文写Codesys程序编写标准中有一条,多个判断条件的if-else-语句,可能性最大的条件应放到最前面,这样可减少PLC处理的时间。但是根据测试,情况并非如此。下面的例子......
  • 二.查询语句
    一.分组查询SELECTMAX(age)FROMstudent;#查询年龄最大的数字为32SELECT*FROMstudentWHEREage=32;#查询32的学生信息SELECT*FROMstudentWHERE......
  • 文件管理——文件的逻辑结构
    ......
  • PHP 中的三元运算符和or表达式对比[defined() or define()]
    在php代码中我们经常看到这样的写法:$max=$a>$b?$a:$b;mysql_connect($user,$passwd,$db)ordie($mess);下面对这两种常见的写法做以下说明:第一种:典型的三元运算......
  • Markdown语句学习-以Typora为例
    一、基础语句1、标题#+空格 2、字体==高亮==`*斜体***加粗*****斜体加粗***~~删除~~上标^2^ 下标~2~ 3、排序无序编号:+空格`有序编号:1.+空格`4、代码......
  • shell语句记录
    sed篇:1.删除指定的字符,比如'a'-----$sed's/a//'file2.移除每一行的第一个字符----$sed's/^.//'file3.移除每一行的最后一个字符---$sed's/.$//'file4.同......