从头开始学习C++——控制流

133 阅读2分钟

TLDR; 这是C++初学者系列的一部分,这一部分是关于控制流的,使用if,else,forwhile 等结构在程序中采取的执行路径。

什么是控制流,我为什么要关心它

控制流是执行指令的顺序。考虑一下下面的代码。

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 > 0false 。要改变这一点,我们可以修改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 ,还有elseelse 表示,如果if 的布尔表达式是假的,那么else 将被运行。因此,没有ifelse 就不能存在。

要使用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 ,我们知道有另一个执行路径,它将运行ifelse 。鉴于上面的代码,它将运行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 正在被击中。这个程序现在有三个不同的路径通过,ifelse ifelse

循环结构,重复指令

if,else ifelse 是使你的代码创建不同执行路径的方法。然而,有时你的代码需要一个不同的行为,它需要重复一个行为,直到一个条件被满足。 举个例子,只要用户输入有效的命令,你就想让他们留在程序中,只有当输入的命令等于 "退出 "时才退出。或者想象一下,你有一个数组的值,你需要对它们进行总结。在这两种情况下,你都需要一个循环结构,尽管是不同类型的循环结构。

让我们看一下第一个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,当你知道更多关于你循环的内容时

还有另一种循环结构,最好了解一下,forfor就像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

总结

你已经了解了ifelse ifelse 。这些结构被用来在你的程序中创建不同的执行路径。你的代码将选择这些路径中的一个。此外,你还了解了用于重复指令的while和for循环。forwhile 不同,因为你有一个变量的概念,可以跟踪你正在进行的循环迭代。