1.4.4 if语句
与大多数语言一样,C++(www.cppentry.com)也提供了if语句来支持条件执行。我们可以用if语句写一个程序,来统计在输入中每个值连续出现了多少次:
- #include <iostream>
- int main()
- {
- // currVal是我们正在统计的数;我们将读入的新值存入val
- int currVal = 0, val = 0;
- // 读取第一个数,并确保确实有数据可以处理
- if (std::cin >> currVal) {
- int cnt = 1; // 保存我们正在处理的当前值的个数
- while (std::cin >> val) { // 读取剩余的数
- if (val == currVal) // 如果值相同
- ++cnt; // 将cnt加1
- else { // 否则,打印前一个值的个数
- std::cout << currVal << " occurs "
- << cnt << " times" << std::endl;
- currVal = val; // 记住新值
- cnt = 1; // 重置计数器
- }
- } // while循环在这里结束
- // 记住打印文件中最后一个值的个数
- std::cout << currVal << " occurs "
- << cnt << " times" << std::endl;
- } // 最外层的if语句在这里结束
- return 0;
- }
如果我们输入如下内容:
- 42 42 42 42 42 55 55 62 100 100 100
则输出应该是:
- 42 occurs 5 times
- 55 occurs 2 times
- 62 occurs 1 times
- 100 occurs 3 times
有了之前多个程序的基础,你对这个程序中的大部分代码应该比较熟悉了。程序以两个变量val和currVal的定义开始:currVal记录我们正在统计出现次数的那个数;val则保存从输入读取的每个数。与之前的程序相比,新的内容就是两个if语句。第一条if语句
- if (std::cin >> currVal) {
- // ...
- } //最外层的if语句在这里结束
保证输入不为空。与while语句类似,if也对一个条件进行求值。第一条if语句的条件是读取一个数值存入currVal中。如果读取成功,则条件为真,我们继续执行条件之后的语句块。该语句块以左花括号开始,以return语句之前的右花括号结束。
如果需要统计出现次数的值,我们就定义cnt,用来统计每个数值连续出现的次数。与上一小节的程序类似,我们用一个while循环反复从标准输入读取整数。
while的循环体是一个语句块,它包含了第二条if语句:
- if (val == currVal) // 如果值相同
- ++cnt; // 将cnt加1
- else { // 否则,打印前一个值的个数
- std::cout << currVal << " occurs "
- << cnt << " times" << std::endl;
- currVal = val; // 记住新值
- cnt = 1; // 重置计数器
- }
这条if语句中的条件使用了相等运算符(==)来检测val是否等于currVal。如果是,我们执行紧跟在条件之后的语句。这条语句将cnt增加1,表明我们再次看到了currVal。
如果条件为假,即val不等于currVal,则执行else之后的语句。这条语句是一个由一条输出语句和两条赋值语句组成的语句块。输出语句打印我们刚刚统计完的值的出现次数。赋值语句将cnt重置为1,将currVal重置为刚刚读入的值val。
C++(www.cppentry.com)用=进行赋值,用==作为相等运算符。两个运算符都可以出现在条件中。一个常见的错误是想在条件中使用==(相等判断),却误用了=。
1.4.4节练习
练习1.17:如果输入的所有值都是相等的,本节的程序会输出什么?如果没有重复值,输出又会是怎样的?
练习1.18:编译并运行本节的程序,给它输入全都相等的值。再次运行程序,输入没有重复的值。
练习1.19:修改你为1.4.1节练习1.10(第13页)所编写的程序(打印一个范围内的数),使其能处理用户输入的第一个数比第二个数小的情况。
关键概念:C++(www.cppentry.com)程序的缩进和格式
C++(www.cppentry.com)程序很大程度上是格式自由的,也就是说,我们在哪里放置花括号、缩进、注释以及换行符通常不会影响程序的语义。例如,花括号表示main函数体的开始,它可以放在main的同一行中;也可以像我们所做的那样,放在下一行的起始位置;还可以放在我们喜欢的其他任何位置。唯一的要求是左花括号必须是main的形参列表后第一个非空、非注释的字符。
虽然很大程度上可以按照自己的意愿自由地设定程序的格式,但我们所做的选择会影响程序的可读性。例如,我们可以将整个main函数写在很长的单行内,虽然这样是合乎语法的,但会非常难读。
关于C/C++(www.cppentry.com)的正确格式的辩论是无休止的。我们的信条是,不存在唯一正确的风格,但保持一致性是非常重要的。例如,大多数程序员都对程序的组成部分设置恰当的缩进,就像我们在之前的例子中对main函数中的语句和循环体所做的那样。对于作为函数界定符的花括号,我们习惯将其放在单独一行中。我们还习惯对复合IO表达式设置缩进,以使输入输出运算符排列整齐。其他一些缩进约定也都会令越来越复杂的程序更加清晰易读。
我们要牢记一件重要的事情:其他可能的程序格式总是存在的。当你要选择一种格式风格时,思考一下它会对程序的可读性和易理解性有什么影响,而一旦选择了一种风格,就要坚持使用。