您的位置:首页 > 编程语言 > C语言/C++

C++ Primer 5th - 1.4 控制流

2016-03-24 11:20 288 查看
语句一般都是顺序执行的:语句块中的第一句话是首先被执行的,接下来是第二句,以此类推。极少数程序—包括我们的书店问题的程序—可以只写顺序执行的语句就可以解决问题。事实上,C++提供了若干种控制流语句使我们可以实现更多复杂的执行顺序。

1.4.1 whlie循环

一条while语句当给定的条件为真时会重复地执行一个语句块中的所有代码。我们可以使用while语句来写一个从1到10并一直累加其和的程序,代码如下:


#include <iostream>
int main()
{
int sum = 0, val = 1;
while (val <= 10) {
sum += val; // assigns sum + val to sum
++val; // add 1 to val
}
std::cout << "Sum of 1 to 10 inclusive is "
<< sum << std::endl;
return 0;
}


当我们编译并运行这个程序时会打印出结果:

Sum of 1 to 10 inclusive is 55

在程序的一开始我们包含了iostream的头文件并定义了main函数。在main函数中我们定义了两个int型变量sum和val,sum用于保存和,val用于保存从1到10之间不同的值,并且将sum初始化为0,val初始化为1。

这个程序的新成员是这条while语句。一条while语句的套路是:
while (条件)
需执行的语句
while语句的执行过程是判断条件是否为真,若为真,则执行相关的语句,就这样一直执行下去,直到当条件为假时才会跳出while语句。在我们的程序里while语句是这样的:

while (val <= 10)
{
sum += val; // assigns sum + val to sum
++val; // add 1 to val
}

while语句里的条件用<=来对当前的val的值和10进行比较。当val小于等于10时条件为真。当条件为真时,程序会执行while的循环体。在这个例子中,循环体是这两句:

{
sum += val; // assigns sum + val to sum
++val; // add 1 to val
}

循环体是被大括号包围的一系列0条或多条语句。在这个例子中,循环体内的第一句话使用了+=操作符。这个操作符将它的右操作数与左操作数相加并将结果存储在左操作数中。这和写sum = sum + val是一样的结果。

下一句话:++val;使用了前置自增操作符。这个自增操作符对操作数进行+1操作,这和写val = val+1;的结果是一样的。

一旦val比10大时,程序将跳出while循环并执行while循环后面的语句。在这个例子中,跳出循环后会打印输出。


1.4.2 for循环

在我们的while循环中使用val来控制我们的循环执行的次数。使用一个变量作为条件并且没做一次循环后自增的套路在编程语言里极其常见,在C++里也并不例外,所以就有了for循环。我们可以使用for循环来重写从1加到10的例子,代码如下:


#include <iostream>
int main()
{
int sum = 0;
// sum values from 1 through 10 inclusive
for (int val = 1; val <= 10; ++val)
sum += val; // equivalent to sum = sum + val
std::cout << "Sum of 1 to 10 inclusive is "
<< sum << std::endl;
return 0;
}


之前的while循环的版本中,我们定义一个sum变量并初始化为0,val初始化为1。在这个for循环的版本中,我们定义val变量为for循环的内部变量。

每个for循环都有两个部分:一个头和一个块。头用来控制块执行的频率和次数。头由3个部分组成:初始化语句、条件、表达式。在这个例子中int val = 1;为初始化语句。定义一个int类型的对象叫val并把它初始化为1。变量val只存活于for循环内部,也就是说for循环执行完后val变量就不存在了。初始化语句只执行一次。val <= 10;是条件。将val的值和10进行比较,条件会每次执行循环体中的语句之前执行。当val小于等于10时,for循环会执行循环体内的代码。++val为表达式,使用前缀自增操作符来对val进行+1操作。当执行完表达式之后,for循环会重置条件。如果新的条件,即val的值小于等于10,那么循环体将会继续执行,直到条件返回假。


1.4.3 读取一个未知数的输入

在之前的2个小章节,我们写了一个从1到10计算其累加和的程序。对这个程序拓展一下我们可以询问用户想要进行累加和计算的一个范围。现在我们不想知道有多少个数字需要进行累加。我们可以一直读取用户输入的数字,直到用户不再输入为止:


#include <iostream>
int main()
{
int sum = 0, value = 0;
while (std::cin >> value)
sum += value; // equivalent to sum = sum + value
std::cout << "Sum is: " << sum << std::endl;
return 0;
}


如果我们对这个程序输入:3 4 5 6 那么程序将会输出结果:Sum is:18。

main函数中第一行定义了两个变量一个叫val另一个叫sum,它们都初始化为0。我们会将读取输入的代码写到while循环的条件部分中,来实现val保存我们从用户那里输入数字时的值:while (std::cin >> value)

std::cin >> value表示从标准输入中读取下一个数字并将其存储到val中。输入操作符的返回值是它的左操作数也就是std::cin,因此在while循环中的条件判定时会判定std::cin是否为真。

当我们使用输入流对象(即istream的对象)作为条件时的效果是检测流的状态。如果流的状态是合法的或有效的(当一个流没有碰到错误时,状态是成功的,有效的)。当我们输入文件结束符或者非法输入(如程序想要你输入一个整数但你输入了一个字符串)时,istream的状态将会变成无效的。当istream的状态为无效或非法时将会导致条件表达式的结果为假。

在我们的例子中,我们的while循环会一直执行,并且当我们输入文件结束符或者非法输入时会跳出while循环。


1.4.4 if语句

和其他大多数编程语言一样,C++同样提供了if语句来支持条件执行。我们可以使用if来写一个程序来统计在输入过程中有多少数是与上次输入不一样的数。代码如下:


#include
4000
<iostream>
int main()
{
int currVal = 0, val = 0;
// read first number and ensure that we have data to process
if (std::cin >> currVal) {
int cnt = 1; // store the count for the current value we're //processing
while (std::cin >> val) { // read the remaining numbers
if (val == currVal) // if the values are the same
++cnt; // add 1 to cnt
else {
std::cout << currVal << " occurs "
<< cnt << " times" << std::endl;
currVal = val; // remember the new value
cnt = 1; // reset the counter
}
} // while loop ends here
// remember to print the count for the last value in the file
std::cout << currVal << " occurs "
<< cnt << " times" << std::endl;
} // outermost if statement ends here
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) {
// ...
}
确定输入是否为空。和while一样,if同样有条件表达式。第一个if中的条件表达式为从标准输入读入一个值存到currVal中。如果读取成功,条件表达式则返回true,并执行用大括号括起来的语句。

我们来看看第二个if,这个if语句中的条件表达式用了==操作符来判断val是否与currVal相等。如果相等,则执行大括号括起来的语句。如果条件返回为false,即val与currVal不相等的情况,我们会执行else语句下的语句块。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 C++