前言
今天我们来看看条件语句,换句话说,也就是 if 语句、if else 和 else if 等等这写语句。
我知道大家基本上已经非常了解 if 语句和所有 C++ 中的分支语句,但我还是鼓励你们继续看完这一讲,这里可能包含一些新东西。我们还会深入一点看它如何在 C++ 中工作,这些对你理解程序如何运行是有一些帮助的。
01 分支语句能干什么
条件语句、if 语句、 分支语句,这些都是什么意思呢?
- 有些时候我们写程序的时候,我们需要对一个特定的条件进行评估,然后根据评估的结果,决定我们想要执行什么代码。
- 举个例子,假设我们有一个变量 x 等于5,我们希望能够编写代码实现判断 这个变量的值是否确定等于5,这就是 条件语句 的本质,这里的条件就是 x 等于5,在此基础上我们可以进行适当的分支。
- 这样的话,有两种情况会发生,当我们运行我们写的 if 语句时,有两个过程,首先是对实际 条件语句 的评估,然后是基于这个条语句评估后的分支语句。换句话说,如果条件为真,我们需要跳到我们源代码的某一部分,如果值为假,我们需要跳到我们源代码的另一部分。
- 当我们开始一个应用程序时,整个应用程序及其所有模块加载到内存中。基本上所有这些指令组成了我们的程序,现在这些指令都存储在内存中,当我们有了条件语句所产生的分支,我们基本上是在告诉电脑,嘿,跳到我们的这部分内存开始吧,在那里执行我们的指令。正因为如此在内存和分支之间跳跃,实际的过程会更复杂一点,这里有相当多的东西值得我们探索一下。
记住,if 语句就是在检查一个条件,如果这件事是真的,我们就去执行一组特定的代码。
02 if语句例子
我们看一个例子。
先做一些解释。
==
操作符称为 比较运算符,它的作用是比较两边的值是否相等。有点像是一个函数,接受两个参数。它会返回一个布尔值类型的结果。
在整数或者在大多数原始的数据结构中,如果你要检查两个数,比如两个整数是否相等,比较运算符基本上是在获取他们的四个字节的内存,然后比较每个字节,这 2 个整数相等的条件是内存的每一位都必须相同。
上面的程序将 x 和 5 比较的结果存储到布尔值的变量 ret中。
我们使用分支语句做点事情。
ret这里可以有两种写法。
// 第一种写法
if(ret)
// 第二种写法
if(ret== true)
这两种写法其实是一个意思,换句话说,在第一种写法中,如果 ret不是 true
,这个 if 语句也将不会运行。
然后我们为这个 if 语句写了分支语句,换句话说,就是分支去哪里?条件成立后你想让我运行什么代码?
我们现在已经创建了一个分支,如果 ret为 true
,我们打印hello world
03 if语句到底在做什么
那么 if 语句到底在做什么呢?它只是在检查这个数字是不是 0 ,如果它是 0,就不会执行 if 语句,如果它不是 0,它会跳到 if 语句内,这就是为什么这整个式子我们不需要做比较运算之类的事情,因为我们不需要检查它是否等于 1 或者是 0,我们可以直接说这个值是不是不是 0,这就是它所做的。
对比两段代码,会发现,当ret 等于 5时,返回1,将ret = 6后,返回了0,hello world也打印了
指针变量也是如此
可以看到执行代码后,打印了指针为空,这是因为我们给指针变量p设置为了NULL,也就是空指针,else语句则是和if语句一起的,逻辑上就是如果****,否则*****
04 else if
#include <iostream>
using namespace std;
int main()
{
char *p = "hello";
if(p == "world")
{
std::cout<< p<<endl;
}else if (p == "hello")
{
std::cout<< p<<endl;
}
return 0;
}
else if 只会是当 if 语句失败之后才会执行。
其实没有所谓的 else if 语句,只是将两个语句放在一行而已,和我们之前将 if 语句的内容的放在 if 的同一行是一样的。else if 只是一个小聪明而已,也就是说如果上面的 if 失败了,就尝试 else if。同样只有在前面的 if 失败后,才会触发 else 语句,才会去比较 p是不是 hello。就是这样。
我记得当我发现的时候,这让我很吃惊,因为我真的没意识到这一点,我觉得 else if 是关键字组合,但是实际上不是,else if 不是 C++ 的关键字,是先 else,然后再 if 。