语句的执行时是顺序的,从第一条语句开始逐次执行。
但是程序设计语言提供了不同的控制流语句,允许我们写出更复杂的执行语句。
1.while语句
while反复执行一条语句,直到给出的条件为假为止。
while(condition)
statement
while语句的执行是交替的检测condition条件和执行关联语句statement,直至condition为假。
所谓条件(condition),就是一个产生真或假的结果的表达式。
例子:
#include <iostream>
using namespace std;
/*
使用while语句来编写从1加到10的程序
*/
int main()
{
int sum = 0,v = 0;
while(v <= 10)
{
sum += v;
v++;
}
cout << "The sum of 1 to 10 is " << sum << endl;
return 0;
}
第一行,定义并初始化了sum,v;
第二行到第五行,使用了控制流语句while。
在条件中,使用了小于等于运算符(<=)来比较v的当前值和10的大小。只要v小于等于10,那么条件即为真,则执行while循环体。否则跳出循环。
循环体是由两条语句组成的语句块(block)。
语句块,即用花括号包围起来的零条或多条语句序列。
语句块的第一行sum += v;使用了复合赋值运算符(+=),此运算符将右侧对象的值加到左侧对象上,并将结果保存到左侧运算对象。等价于sum = sum + v;
下一条语句v++;使用后缀递增运算符。等价于v = v + 1;和++v的区别是一个是先用再自加,一个是先自加再用。
第六行,输出语句。
第七行,return语句。
运行结果图如下:
2.for语句
在while循环例子中,使用了v来控制循环的次数。我们在循环条件中检测v的值,在while语循环体中将v递增。
这种在循环条件中检测变量、在循环体中递增变量的模式非常普遍,以至于c++专门定义了第二种循环语句--for语句,来简化这种模式的语句。
我们用for语句来重写从1加到10的程序。
例子:
#include <iostream>
using namespace std;
/*
使用for语句来编写从1加到10的程序
*/
int main()
{
int sum = 0;
for(int v = 0 ; v <= 10 ; v++)
sum += v;//等价于sum = sum + v;
cout << "The sum of 1 to 10 is " << sum << endl;
return 0;
}
我们直接看第二行和第三行
for语句包含循环头和循环体,第二行为循环头,第三行为循环体。
循环头控制循环体的执行次数,由三部分组成,分别为一个初始化语句(init-statement),一个循环条件(condition),一个表达式(expression)。
在本例中,初始化语句:int v = 0;初始化语句只在进入for循环入口使用一次。
条件语句:v <= 10;每次执行循环体之前都会查看循环条件。循环条件为真则,执行循环体。否则,跳出for循环。
表达式:v++;每次执行循环体之后都会执行表达式。执行完表达式之后,查看循环条件。
简要重述for循环执行过程:
1.创建变量v并初始化;
2.查看循环条件;
3.循环条件为真,执行循环体。否则,跳出for循环。
4.执行完循环体,执行表达式。
5.执行完表达式,进入第2步。
例子程序执行结果如下:
读取不定数量的输入数据
前面的两个例子中,我们事先都知道了求和的数字和数字的个数。拓展程序,我们要实现未知数字个数和数字内容的求和。
看例子:
#include <iostream>
using namespace std;
int main()
{
int a = 0,sum = 0;
while(cin >> a)
sum += a;
cout << "sum:" << sum << endl;
return 0;
}
第一行,定义加初始化。
第二行循环条件,循环条件的求值就是执行表达式。
此表达式是从标准输入读取一个数,保存在v中。
输入运算符的运算结果返回其左侧的运算对象。
当我们使用一个istream对象作为循环条件时,其效果是检测流的状态。如果流是有效的,即流未遇到错误,那么检测成功。当遇到文件结束符,或者无效输入时(输入非int型
据)istream对象会变成无效。
第三行输出语句
第四行return
PS:从键盘键入结束符,不同的系统有不同的约定。在windows系统中,输入文件结束符的方法是敲ctrl+z,然后按enter键。在unix或macos中,文件结束符输入ctrl+d。
运行结果如图:
3.if语句
看例子:
#include <iostream>
using namespace std;
int main()
{
int c = 0,v = 0;
if(cin >> c)
{
int t = 1;
while(cin >> v)
{
if(v == c)
{
t++;
}else
{
cout << c << "出现了" << t << "次" << endl;
t = 1;
c = v;
}
}
cout << c << "出现了" << t << "次" << endl;
}
return 0;
}
本例的作用是统计所输入的数字次数,知道遇到文件结束符或非int型数字为止。
这个例子结合了if和前面所学的while。
在第11行if的条件中使用了相等运算符(==)来检测v是否等于c。如果是,我们执行条件语句后面的语句,如果不是则执行else后面的语句。
运行结果如图:
在最后我们一起了解c++程序的缩进和格式。
c++程序在很大程度上是格式自由的,也就是我们在哪里放花括号、缩进、注释以及换行符通常不会影响程序的语义。
虽然如此,但是我们的选择会影响程序对于人可读性。比如,如果我们将main函数中的所有语句写在同一行中,程序员读程序就会很有难度。
关于c++程序格式的争辩是无休止的。我们的信条是,不存在唯一正确的格式,但是保持格式的一致性是非常重要的。