- 内容提要
- 前言
- 第 1 章 预备知识
- 第 2 章 开始学习 C++
- 第 3 章 处理数据
- 第 4 章 复合类型
- 第 5 章 循环和关系表达式
- 第 6 章 分支语句和逻辑运算符
- 第 7 章 函数——C++的编程模块
- 第 8 章 函数探幽
- 第 9 章 内存模型和名称空间
- 第 10 章 对象和类
- 第 11 章 使用类
- 第 12 章 类和动态内存分配
- 第 13 章 类继承
- 第 14 章 C++中的代码重用
- 第 15 章 友元、异常和其他
- 第 16 章 string 类和标准模板库
- 第 17 章 输入、输出和文件
- 第 18 章 探讨 C++新标准
- 附录 A 计数系统
- 附录 B C++保留字
- 附录 C ASCII 字符集
- 附录 D 运算符优先级
- 附录 E 其他运算符
- 附录 F 模板类 string
- 附录 G 标准模板库方法和函数
- 附录 H 精选读物和网上资源
- 附录 I 转换为 ISO 标准 C++
- 附录 J 复习题答案
6.1 if 语句
当 C++程序必须决定是否执行某个操作时,通常使用 if 语句来实现选择。if 有两种格式:if 和 if else。首先看一看简单的 if,它模仿英语,如“If you have a Captain Cookie card, you get a free cookie(如果您有一张 Captain Cookie 卡,就可获得免费的小甜饼)”。如果测试条件为 true,则 if 语句将引导程序执行语句或语句块;如果条件是 false,程序将跳过这条语句或语句块。因此,if 语句让程序能够决定是否应执行特定的语句。
if 语句的语法与 while 相似:
如果 test-condition(测试条件)为 true,则程序将执行 statement(语句),后者既可以是一条语句,也可以是语句块。如果测试条件为 false,则程序将跳过语句(参见图 6.1)。和循环测试条件一样,if 测试条件也将被强制转换为 bool 值,因此 0 将被转换为 false,非零为 true。整个 if 语句被视为一条语句。
通常情况下,测试条件都是关系表达式,如那些用来控制循环的表达式。例如,假设读者希望程序计算输入中的空格数和字符总数,则可以在 while 循环中使用 cin.get(char)来读取字符,然后使用 if 语句识别空格字符并计算其总数。程序清单 6.1 完成了这项工作,它使用句点(.)来确定句子的结尾。
图 6.1 if 语句的结构
程序清单 6.1 if.cpp
下面是该程序的输出:
正如程序中的注释指出的,仅当 ch 为空格时,语句++spaces;才被执行。因为语句++tota;位于 if 语句的外面,因此在每轮循环中都将被执行。注意,字符总数中包括按回车键生成的换行符。
6.1.1 if else 语句
if 语句让程序决定是否执行特定的语句或语句块,而 if else 语句则让程序决定执行两条语句或语句块中的哪一条,这种语句对于选择其中一种操作很有用。C++的 if else 语句模仿了简单的英语,如“If you have a Captain Cookie card, you get a Cookie Plus Plus, else you just get a Cookie d'Ordinaire(如果您拥有 Captain Cookie 卡,将可获得 Cookie Plus Plus,否则只能获得 Cookie d'Ordinaire)”。if else 语句的通用格式如下:
如果测试条件为 true 或非零,则程序将执行 statement1,跳过 statement2;如果测试条件为 false 或 0,则程序将跳过 statement1,执行 statement2。因此,如果 answer 是 1492,则下面的代码片段将打印第一条信息,否则打印第二条信息:
每条语句都既可以是一条语句,也可以是用大括号括起的语句块(参见图 6.2)。从语法上看,整个 if else 结构被视为一条语句。
图 6.2 if else 语句的结构
例如,假设要通过对字母进行加密编码来修改输入的文本(换行符不变)。这样,每个输入行都被转换为一行输出,且长度不变。这意味着程序对换行符采用一种操作,而对其他字符采用另一种操作。正如程序清单 6.2 所表明的,if else 使得这项工作非常简单。该程序清单还演示了限定符 std::,这是编译指令 using 的替代品之一。
程序清单 6.2 ifelse.cpp
下面是该程序的运行情况:
注意,程序清单 6.2 中的注释之一指出,将++ch 改为 ch+1 将产生一种有趣的效果。能推断出它是什么吗?如果不能,就试验一下,然后看看是否可以解释发生的情况(提示:想一想 cout 是如何处理不同的类型的)。
6.1.2 格式化 if else 语句
if else 中的两种操作都必须是一条语句。如果需要多条语句,需要用大括号将它们括起来,组成一个块语句。和有些语言(如 BASIC 和 FORTRAN)不同的是,由于 C++不会自动将 if 和 else 之间的所有代码视为一个代码块,因此必须使用大括号将这些语句组合成一个语句块。例如,下面的代码将出现编译器错误:
编译器把它看作是一条以 zorro ++;语句结尾的简单 if 语句,接下来是一条 cout 语句。到目前为止,一切正常。但之后编译器发现一个独立的 else,这被视为语法错误。
请添加大括号,将语句组合成一个语句块:
由于 C++是自由格式语言,因此只要使用大括号将语句括起,对大括号的位置没有任何限制。上述代码演示了一种流行的格式,下面是另一种流行的格式:
第一种格式强调的是语句的块结构,第二种格式则将语句块与关键字 if 和 else 更紧密地结合在一起。这两种风格清晰、一致,应该能够满足要求;然而,可能会有老师或雇主在这个问题上的观点强硬而固执。
6.1.3 if else if else 结构
与实际生活中发生的情况类似,计算机程序也可能提供两个以上的选择。可以将 C++的 if else 语句进行扩展来满足这种需求。正如读者知道的,else 之后应是一条语句,也可以是语句块。由于 if else 语句本身是一条语句,所以可以放在 else 的后面:
如果 ch 不是'A',则程序将执行 else。执行到那里,另一个 if else 又提供了两种选择。C++的自由格式允许将这些元素排列成便于阅读的格式:
这看上去像是一个新的控制结构——if else if else 结构。但实际上,它只是一个 if else 被包含在另一个 if else 中。修订后的格式更为清晰,使程序员通过浏览代码便能确定不同的选择。整个构造仍被视为一条语句。
程序清单 6.3 使用这种格式创建了一个小型测验程序。
程序清单 6.3 ifelseif.cpp
下面是该程序的输出:
条件运算符和错误防范
许多程序员将更直观的表达式 variable = =value 反转为 value = =variable,以此来捕获将相等运算符误写为赋值运算符的错误。例如,下述条件有效,可以正常工作:
if (3 == myNumber)
但如果错误地使用下面的条件,编译器将生成错误消息,因为它以为程序员试图将一个值赋给一个字面值(3 总是等于 3,而不能将另一个值赋给它):
if (3 = myNumber)
假设犯了类似的错误,但使用的是前一种表示方法:
if (myNumber = 3)
编译器将只是把 3 赋给 myNumber,而 if 中的语句块将包含非常常见的、而又非常难以发现的错误(然而,很多编译器会发出警告,因此注意警告是明智的)。一般来说,编写让编译器能够发现错误的代码,比找出导致难以理解的错误的原因要容易得多。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论