c++tutoial(六)

声明和流量控制

一个简单的C ++语句是程序的各个指令,比如前面部分中的变量声明和表达式。它们总是以分号(;)结尾,并按照它们在程序中出现的顺序执行。

但是程序不仅限于线性序列的陈述。在其过程中,程序可以重复代码段,或者做出决定和分叉。为此,C ++提供了流控制语句,用于指定程序必须完成的操作,何时以及在何种情况下。

本节中介绍的许多流控制语句都需要通用(子)语句作为其语法的一部分。该语句可以是简单的C ++语句,例如单个指令,以分号结尾(;) - 或复合语句。复合语句是一组语句(每个语句都以它自己的分号结尾),但是所有语句都在一个块中组合在一起,用大括号括起来:{}:

{ statement1; statement2; statement3; }

整个块被认为是一个单独的语句(由多个子语句组成) 。每当泛型语句是流控制语句的语法的一部分时,它可以是简单语句或复合语句。

选择陈述:if和else
if当且仅当满足条件时, 该关键字用于执行语句或块。它的语法是:

if (condition) statement

这里condition是正在评估的表达式。如果condition是,statement则执行。如果为false,statement则不执行(只是忽略它),程序在整个选择语句之后继续执行。
例如,以下代码片段(x is 100)仅在存储在x变量中的值确实为100 时才打印消息:

if (x == 100)
cout << “x is 100”;

如果x不完全是100,则忽略此语句,并且不打印任何内容。

扫描二维码关注公众号,回复: 4529695 查看本文章

如果要在满足条件时包含多个要执行的语句,则这些语句应括在大括号({})中,形成一个块:

if (x == 100)
{
cout << "x is ";
cout << x;
}

像往常一样,代码中的缩进和换行没有任何影响,因此上面的代码相当于:

if (x == 100) { cout << "x is "; cout << x; }

选择语句if还可以通过使用else关键字引入替代语句来指定在未满足条件时发生的情况。它的语法是:在case condition为true的情况下执行 where ,如果不是,则执行。 例如:

if (condition) statement1 else statement2

statement1statement2

if (x == 100)
cout << “x is 100”;
else
cout << “x is not 100”;

x is 100如果确实x的值为100,则会 打印,但如果不是,则仅在不打印时打印,而是打印x is not 100。
可以连接几个if + else结构,以便检查一系列值。例如:

if (x > 0)
cout << “x is positive”;
else if (x < 0)
cout << “x is negative”;
else
cout << “x is 0”;

这通过连接两个if-else结构来打印x是正数,负数还是零。同样,通过将它们分组为括号中的块,每个案例也可以执行多个语句:{}。

迭代语句(循环)
循环重复一次语句一定次数,或满足条件时。它们通过关键字引入while,do和for。

while循环
最简单的循环是while循环。它的语法是: while循环只是重复而while 是真的。如果任执行后,不再为true,循环结束,程序循环之后继续。例如,让我们看看使用while循环的倒计时:

while (expression) statement

statementexpressionstatementexpression

// custom countdown using while
#include
using namespace std;

int main ()
{
int n = 10;

while (n>0) {
cout << n << ", ";
–n;
}

cout << “liftoff!\n”;
}
10,9,8,7,6,5,4,3,2,1,升空!
编辑并运行

main集合n中 的第一个语句为值10.这是倒计时中的第一个数字。然后while循环开始:如果该值满足条件n>0(n大于零),则执行条件之后的块,并且只要条件(n>0)保持为真,就重复该条件。

可以根据以下脚本(从头开始main)解释前一个程序的整个过程:

n 被赋予一个值
该while条件被选中(n>0)。此时有两种可能性:
condition为true:执行语句(到第3步)
condition为false:忽略语句并在其后继续(到第5步)
执行语句:( 打印值减1 并减1)
cout << n << ", ";
–n;
nn
块结束。自动返回第2步。
在程序段后立即继续执行程序:
打印liftoff!并结束程序。

while循环要考虑的一点是循环应该在某个点结束,因此语句应该以某种方式改变在条件中检查的值,以便在某些时候强制它变为false。否则,循环将继续循环。在这种情况下,循环包括–n,将条件(n)中正在计算的变量的值减1;这将最终使条件(n>0)在一定数量的循环迭代后失败。更具体地说,在10次迭代之后,n变为0,使条件不再为真,并结束while循环。

请注意,这个循环的复杂性对于计算机来说是微不足道的,因此整个倒计时是立即执行的,计数元素之间没有任何实际延迟(如果感兴趣,请查看sleep_for延迟的倒计时示例)。

do-while循环
一个非常相似的循环是do-while循环,其语法是: 它的行为类似于while循环,除了在执行之后而不是之前进行计算,保证至少执行一次,即使永远不会执行。例如,以下示例程序回显用户引入的任何文本,直到用户进入再见:

do statement while (condition);

conditionstatementstatementcondition

// echo machine
#include
#include
using namespace std;

int main ()
{
string str;
do {
cout << "Enter text: ";
getline (cin,str);
cout << "You entered: " << str << ‘\n’;
} while (str != “goodbye”);
}
输入文字:你好
你输了:你好
输入文字:谁在那里?
你输入了:谁在那里?
输入文字:再见
你输入了:再见
编辑并运行

当statement需要至少执行一次时,例如当在循环语句本身内确定检查到循环结束的条件时,do-while循环通常优于while循环。在前面的示例中,块内的用户输入将决定循环是否结束。因此,即使用户想要通过输入尽快结束循环再见,循环中的块需要至少执行一次以提示输入,实际上,只有在执行后才能确定条件。

for循环
该for循环被设计为迭代多次。它的语法是: 像while循环一样,这个循环重复,而它是真的。但是,此外,for循环提供了包含a 和表达式的特定位置,分别在循环开始第一次之前和每次迭代之后执行。因此,使用计数器变量特别有用。 它的工作方式如下:

for (initialization; condition; increase) statement;

statementconditioninitializationincreasecondition

initialization被执行。通常,这会声明一个计数器变量,并将其设置为某个初始值。这在循环开始时执行一次。
condition被检查。如果是,则循环继续; 否则,循环结束,并statement跳过,直接进入步骤5。
statement被执行。像往常一样,它可以是单个语句,也可以是用花括号括起来的块{ }。
increase 执行,循环返回到步骤2。
循环结束:执行后继续执行下一个语句。

这是使用for循环的倒计时示例:

// countdown using a for loop
#include
using namespace std;

int main ()
{
for (int n=10; n>0; n–) {
cout << n << ", ";
}
cout << “liftoff!\n”;
}
10,9,8,7,6,5,4,3,2,1,升空!
编辑并运行

for循环中的三个字段是可选的。它们可以留空,但在所有情况下都需要它们之间的分号。例如,for (;n<10;)是一个没有初始化或增加的循环(相当于一个while循环); 并且for (;n<10;++n)是一个增加的循环,但没有初始化(可能因为变量在循环之前已经初始化)。没有条件的循环等同于具有true条件的循环(即,无限循环)。

因为每个字段中在一个循环的生命周期的特定时间被执行时,它可以在多于一个单一表达式作为任何的是执行有用初始化,条件或声明。不幸的是,这些不是语句,而是简单的表达式,因此不能被块替换。但是,作为表达式,它们可以使用逗号运算符(,):此运算符是表达式分隔符,可以分隔多个表达式,其中通常只需要一个表达式。例如,使用它,for循环可以处理两个计数器变量,初始化和增加两个:

for ( n=0, i=100 ; n!=i ; ++n, --i )
{
// whatever here…
}

如果在循环中没有n或被i修改,则该循环将执行50次:

n以值0开始,并且i对于100,条件是n!=i(即,n不等于i)。因为n增加一,并且i在每次迭代减少之一,循环的条件将第50次迭代后成为假,当两个n和i都等于50。

基于范围的循环
for循环有另一种语法,它专门用于范围: 这种for循环遍历所有元素,其中声明一些变量能够获取该范围内元素的值。范围是元素序列,包括数组,容器和支持函数的任何其他类型

for ( declaration : range ) statement;

rangedeclaration开始 和 结束; 大多数这些类型尚未在本教程中介绍,但我们已经熟悉至少一种范围:字符串,它们是字符序列。

使用字符串的基于范围的for循环的示例:

// range-based for loop
#include
#include
using namespace std;

int main ()
{
string str {“Hello!”};
for (char c : str)
{
cout << “[” << c << “]”;
}
cout << ‘\n’;
}
[你好][!]
编辑并运行

注意:for循环中冒号前面的内容是char变量的声明(字符串中的元素是类型char)。然后我们c在语句块中使用此变量来表示范围中每个元素的值。

此循环是自动的,不需要显式声明任何计数器变量。

基于范围的循环通常也使用类型推导的元素类型auto。通常,上面的基于范围的循环也可以写成:

for (auto c : str)
cout << “[” << c << “]”;

这里,类型c被自动推断为元素的类型str。

跳转声明
跳转语句允许通过跳转到特定位置来改变程序的流程。

休息声明
break即使不满足其结束的条件,也会留下一个循环。它可用于结束无限循环,或强制它在自然结束之前结束。例如,让我们在自然结束前停止倒计时:

// break loop example
#include
using namespace std;

int main ()
{
for (int n=10; n>0; n–)
{
cout << n << ", ";
if (n==3)
{
cout << “countdown aborted!”;
break;
}
}
}
10,9,8,7,6,5,4,3倒计时中止!
编辑并运行

继续声明
该continue语句使程序跳过当前迭代中的其余循环,就好像已到达语句块的结尾一样,导致它跳转到下一次迭代的开始。例如,让我们在倒计时中跳过5号:

// continue loop example
#include
using namespace std;

int main ()
{
for (int n=10; n>0; n–) {
if (n==5) continue;
cout << n << ", ";
}
cout << “liftoff!\n”;
}
10,9,8,7,6,4,3,2,1,升空!
编辑并运行

goto语句
goto允许绝对跳转到程序中的另一个点。此无条件跳转忽略嵌套级别,并且不会导致任何自动堆栈展开。因此,小心使用是一个特征,最好是在同一个语句块中,特别是在存在局部变量的情况下。

目标点由标签标识,然后将其用作goto语句的参数。甲标签的情况下(一个有效标识符,后跟一个冒号的:)。

goto通常被认为是低级功能,在通常与C ++一起使用的现代高级编程范例中没有特定的用例。但是,举个例子,这是我们使用goto的倒计时循环的一个版本:

// goto loop example
#include
using namespace std;

int main ()
{
int n=10;
mylabel:
cout << n << ", ";
n–;
if (n>0) goto mylabel;
cout << “liftoff!\n”;
}
10,9,8,7,6,5,4,3,2,1,升空!
编辑并运行

另一个选择声明:切换。
switch语句的语法有点奇怪。其目的是检查许多可能的常量表达式中的值。它类似于连接if- else语句,但仅限于常量表达式。其最典型的语法是:

switch (expression)
{
case constant1:
group-of-statements-1;
break;
case constant2:
group-of-statements-2;
break;
.
.
.
default:
default-group-of-statements
}

它的工作方式如下:switch评估expression并检查它是否等同于constant1; 如果是,则执行group-of-statements-1直到找到该break语句。当它找到这个break语句时,程序跳转到整个switch语句的结尾(结束括号)。

如果表达式不等于constant1,则对其进行检查constant2。如果它等于这个,它将执行group-of-statements-2直到break找到a,当它跳转到开关的末尾。

最后,如果表达式的值与先前指定的任何常量(可能有任何数量的这些)不匹配,程序将执行default:标签后面包含的语句(如果存在)(因为它是可选的)。

以下两个代码片段都具有相同的行为,演示了switch语句的if-else等价物:

切换示例 if-else等价
switch (x) {
case 1:
cout << “x is 1”;
break;
case 2:
cout << “x is 2”;
break;
default:
cout << “value of x unknown”;
}
if (x == 1) {
cout << “x is 1”;
}
else if (x == 2) {
cout << “x is 2”;
}
else {
cout << “value of x unknown”;
}

该switch语句有一些从第一个C编译器的早期继承的特殊语法,因为它使用标签而不是块。在最典型的用法中(如上所示),这意味着break在特定标签的每组语句之后需要语句。如果break不包括,则也会执行该案例后面的所有语句(包括任何其他标签下的语句),直到达到switch块或跳转语句(例如break)的结尾。

如果上面的示例在第一个案例之后缺少break语句,则程序在打印后不会自动跳转到switch块的末尾,x is 1而是在第二种情况下继续执行语句(因此也会打印)x is 2)。然后它将继续这样做,直到break遇到语句或switch块结束。这使得不必将每个案例的语句括在大括号中{},并且对于为不同的可能值执行相同的语句组也是有用的。例如:

switch (x) {
case 1:
case 2:
case 3:
cout << “x is 1, 2 or 3”;
break;
default:
cout << “x is not 1, 2 nor 3”;
}

请注意,switch仅限于将其评估的表达式与作为常量表达式的标签进行比较。不能将变量用作标签或范围,因为它们不是有效的C ++常量表达式。

要检查非常量的范围或值,最好使用if和else if语句的连接。

猜你喜欢

转载自blog.csdn.net/qit1314/article/details/85034066