TLDR; 这是C++初学者系列的一部分,这一部分是关于控制流的,使用
if,else,for和while等结构在程序中采取的执行路径。
- 你的第一个程序
- 变量
- 与输入和输出一起工作
- 函数
- 控制流,你在这里
- 与文件打交道
- 指针
- 错误管理
- 结构和类
什么是控制流,我为什么要关心它
控制流是执行指令的顺序。考虑一下下面的代码。
int main()
{
int value = 3;
cout << value;
return 0;
}
在这个例子中,我们有一个main() 。代码将从上到下执行,首先是value 的声明,然后是对cout 的调用,以打印值,最后是return 语句。
然而,有时你想改变这种流程,所以它不是从上到下。想这样做的原因是,你的代码中可能有一个条件,说执行这些语句而不是那个,或者你可能想重复一组语句。
接下来让我们看看如何用if 来控制流程。
如果,一个新的执行路径
通过使用if ,你可以在代码中声明,如果某个条件成立,那么代码应该做一些不同的事情。通常情况下,你的if 构造看起来像这样。
if(condition)
{
// do something
}
if 构造将一个bool条件包裹在小括号内,并使用大括号来定义如果条件评估为真应该发生什么。下面是一个例子。
cout << "Welcome to your account\n";
int account_balance = 0;
if(account_balance > 0)
{
cout << "You can withdraw money";
}
如果我们运行这段代码,它将只打印 "欢迎来到您的账户",因为account_balance > 0 是false 。要改变这一点,我们可以修改account_balance ,例如,将其设置为10。
cout << "Welcome to your account\n";
int account_balance = 10;
if(account_balance > 0)
{
cout << "You can withdraw money\n";
}
现在你的代码将打印。
Welcome to your account
You can withdraw money
你在这里看到的account_balance > 0 ,是一个布尔表达式,你可以直接用真或假的值来替换它。
否则,那么该怎么做
到目前为止,我们看了使用if ,还有else 。else 表示,如果if 的布尔表达式是假的,那么else 将被运行。因此,没有if ,else 就不能存在。
要使用else ,你就把它放在if 的后面,它不需要一个布尔表达式。让我们修改之前的代码,将else 。
cout << "Welcome to your account\n";
int account_balance = 10;
if(account_balance > 0)
{
cout << "You can withdraw money\n";
}
else
{
cout << "No money, you can' withdraw\n";
}
随着我们加入else ,我们知道有另一个执行路径,它将运行if 或else 。鉴于上面的代码,它将运行if ,让我们改变一下。
cout << "Welcome to your account\n";
int account_balance = 0;
if(account_balance > 0)
{
cout << "You can withdraw money\n";
}
else
{
cout << "No money, you can't withdraw\n";
}
如果你运行这个,你的程序会说。
Welcome to your account
No money, you can't withdraw
你可能有另一种情况,如果你想一想,如果你的余额是负的,那可能会发生。看起来接下来用else if 。
Else-If,如果if 失败
好的,所以你有另一个条件,如果if 失败,你想测试一下,而且是一个特定的条件,比如检查负的余额?很好,这时你应该使用else if 。和if 一样,else if 在括号内接受一个条件。另外,就像else 一样,没有if 它就不能存在。下面是我们如何修改我们的代码以纳入else if 。
cout << "Welcome to your account\n";
int account_balance = -10;
if(account_balance > 0)
{
cout << "You can withdraw money\n";
}
else if(account_balance < 0)
{
cout << "You are overdrawn, please top up the balance to at least 0\n";
}
else
{
cout << "No money, you can't withdraw\n";
}
如果你运行这段代码,你现在会得到这样的输出。
Welcome to your account
You are overdrawn, please top up the balance to at least 0
正如你所看到的,else if 正在被击中。这个程序现在有三个不同的路径通过,if ,else if 和else 。
循环结构,重复指令
if,else if 和else 是使你的代码创建不同执行路径的方法。然而,有时你的代码需要一个不同的行为,它需要重复一个行为,直到一个条件被满足。 举个例子,只要用户输入有效的命令,你就想让他们留在程序中,只有当输入的命令等于 "退出 "时才退出。或者想象一下,你有一个数组的值,你需要对它们进行总结。在这两种情况下,你都需要一个循环结构,尽管是不同类型的循环结构。
让我们看一下第一个while 。
While, repeat until false
用while ,你表示你想重复一组指令,直到错误为止。让我们以下面的代码为例。
int value = 3;
while(value < 5)
{
value++;
}
cout << "Value is" << value; // prints 5
上面将重复这个循环两次,因为第一次,value ,并递增到4。下次迭代,4将递增到5。最后一次,由于值是5,所以检查失败。
下面是另一个例子,你可以用来创建基于命令的控制台程序。
string user_input = "";
while(true)
{
cout << "Type a command: ";
getline(cin, user_input);
if(user_input == "quit")
{
break;
}
cout << "You typed: " << user_input;
if(user_input == "hello")
{
cout << "Greetings";
} else {
cout << "Unknown command: " + user_input;
}
// add command definitions here
}
cout << "Bye";
上面的一个可能的程序执行可以是。
> Type a command: hello
> Greetings
> Type a command: help
> Unknown command: help
> Type a command: quit
> Bye
注意在这段代码中使用的是break 。
if(user_input == "quit")
{
break;
}
调用break while,停止循环,使其不再循环。
for,当你知道更多关于你循环的内容时
还有另一种循环结构,最好了解一下,for 。for就像while ,它允许你重复指令直到满足一个条件。它的不同之处在于,在for 循环中,你有额外的概念,一个跟踪起点的索引变量,一个比较点和增量点。下面是一个例子。
// will print values 0-9
for(int i=0; i< 10; i++)
{
cout << i;
}
这里有三个部分。
int i = 0, 这是你初始化一个变量的地方i < 10, 对于每一个迭代,循环结构将测试这个比较点,如果结果为假,那么循环将停止i++, 这是每次迭代时i++被递增的地方。
一个更真实的例子是迭代一组记录,比方说一个银行账户的操作。
vector<int> transactions;
transactions.push_item(100);
transactions.push_item(-50);
transactions.push_item(-25);
transactions.push_item(50);
int sum = 0;
for(int i=0; i< transactions.size(); i++)
{
sum += transactions[i];
}
cout << "Your account balance is: " << sum;
transactions 正在被迭代,对于其集合中的每一项,其值被添加到 。sum
总结
你已经了解了if 、else if 和else 。这些结构被用来在你的程序中创建不同的执行路径。你的代码将选择这些路径中的一个。此外,你还了解了用于重复指令的while和for循环。for 与while 不同,因为你有一个变量的概念,可以跟踪你正在进行的循环迭代。