前面着重介绍不同的数据类型,实际的程序还需要流程。这个流程里面可能有分支,也可能有循环等等。首先先展示if语句的语法内容。

if

if语法就是说按照条件去执行代码。我们来看这个最简单的例子。

  1. int num = 10;
  2. if (num < 5)
  3. cout << "The number is less than 5. " << endl;

我们首先有一个变量num,并赋初始值为10。第二行为一个if 语句,当if num < 5,满足这个条件那么就执行如下代码:cout << "The number is less than 5. " << endl;,打印一个字符串。这个就是一个最简单的if语句。

  1. if (num == 5 )
  2. {
  3. cout << "The number is 5." << endl;
  4. }
  5. else
  6. cout << "The number is not 5." << endl;

那么如果稍微复杂一点点:上面代码有一个条件,但是有两个分支。if这个条件满足的话,那就打印cout << "The number is 5." << endl;。如果这个条件不满足,也就是else这个部分就会被执行。 :::warning 当判断语句的要执行代码只有一行的话,可以不用括号。如果有多行,那一定要加上{}。 :::

  1. if (num < 5)
  2. cout << "The number is less than 5." << endl;
  3. else if (num > 10)
  4. cout << "The number is greater than 10." << endl;
  5. else
  6. cout << "The number is in range [5, 10]." << endl;

上述代码中有三个分支,两个if条件。

  1. if(num < 10)
  2. if(num < 5)
  3. cout << "The number is less than 5" << endl;
  4. else
  5. cout << "Where I'm?" << endl;

if语句也是可以嵌套的。上述代码中只有当num < 10的情况下,才会执行下面代码。之后在if语句中又嵌套了一个if语句,条件是num < 5

上述代码中有一个问题:代码故意没有缩进,但语法上缩进与否的结果是没有区别的。那么对于这个例子,else是和第一个还是第二个if的匹配呢? :::info 语法里规定:如果没有花括号隔离,那么else 跟最近的if 配对。 ::: 虽然上述代码语法是对的,但是在实际编译的时候,大部分编译器可能会给一个警告:提示这样写代码很容易混淆。所以为了代码好阅读、好维护,最好是加上了括号

三目运算符 ? : operator

我们先来看一个if-else的例子。

  1. bool isPositive = true;
  2. int factor = 0;
  3. //some operations may change isPositive's value
  4. if(isPositive)
  5. factor = 1;
  6. else
  7. factor = -1;

在这个例子里面呢,有个bool类型变量isPositive,还有一个整数变量 factor。该代码块的功能:如果isPositive 是true,系数赋值为1;如果isPositive是False,系数就为-1。其实实现的是一个赋值操作,不同的条件赋不同的值。在这种条件下,你可以用if-else来做,但还有一个更简洁的写法,用这个三元运算符。

  1. factor = isPositive ? 1 : -1;

三元运算符有三个操作数,第一个操作数是在问号的前面,是个表达式,也是个条件。如果这个条件是成立的话,那么表达式就取值第二个操作数的值。如果这个条件不成立,那就取值第三个操作数-1。所以说呢。三目运算符的第一个是条件,第二是条件成立时的值,第三是条件不成立的时候的值。

  1. factor = (isPositive) * 2 - 1;

在上述例子中,略微有点特殊。其实我们有更好的做法。不管是if-else还是用三元运算符,都避免不了一个事情:根据这个条件来跳转,也就是说代码会生成跳转语句。那输入机器码里面可能会有跳转语句,导致程序运行效率较低。

isPositive 是一个布尔类型,只有0和1两种情况,True为1,false为0。然后将其乘以2减1。在这种情况下,如果是True的话,那乘以二等于2,减一等于一。如果是False 的话,它是0乘以2减1就变成负一了。这样也同样实现了为factor赋值。由于此语句涉及的都是计算,没有跳转,所以此方法要比前面这两种做法更加的高效。

Condition 条件

前面提及到的if语句中,谈到如果条件成立就怎么样,条件不成立怎么样,到底什么是条件呢?
image.png
上图就是刚才的例子。如果num < 5 这个条件成立,那就会执行其下面的语句。

:::info 条件就是一个表达式 :::

  • The condition should be an expression which is convertible to bool
    • Its value can be bool, char, int, float

如果表达式能够被转化为布尔类型。那么该表达式就可以作为条件。转换指的是隐式的类型转换。比如说本身就是bool类型,或者说是char、int、float数据类型其实都可以作为条件。

  • The condition can be a relational expression
  • The 6 relational/comparison operators

我们先说一说关系表达式。关系表达式有六种:

Operator name Example
equal to a == b
not equal to a != b
less than a < b
greater than a > b
less than or equal to a <= b
greater than or equal to a >= b
  • Return 1 if the condition (such as a==b) is true,
  • Return 0 if the condition is false.

如果这个表达式的条件是成立的,比如ab相等,那么这个表达式(条件)为True,在这True 和 1是等价的。如果不成立,那么就是0,这就是关系表达式。它表达左右两边的操作数是不是相同,是不是大于、是不是小于等条件是否满足。

第二种表达式:逻辑表达式。

  • If an operand is not bool, it will be converted to bool implicitly.
    • 如果操作数不是bool类型,其会转化成bool类型 | Operator name | Symbol-like operator | Keywork like operator | Example | | —- | —- | —- | —- | | negation 取反 | ! | not | !a | | AND 逻辑and | && | and | a && b | | Inclusive OR 逻辑或 | || | or | a || b |

:::warning && 逻辑 and
& 按位and运算 bit-wise and :::

  • Precedence 优先级
    • **!** > **&&** > **||**

e.g.

  • What’s the value of the follow expressions? ```cpp if(-2 && true) cout << “The condition is true.” << endl;

if(!-2) cout << “ (!-2) is true, really?” << endl;

如果操作数不是布尔类型,他会转成布尔类型,是隐式的转换。`-2`转`bool`类型为`True`,`-2 && true` 为 True。`!-2`为False。

:::info

- They will be converted to **bool** implicitly if it is feasible.
   - 只要表达式能够被隐式的转成布尔类型,那么就可以作为条件。
:::
```cpp
float count = 0.2f;
if (count) //not recommend to use a float-point number
    cout << "There are some." << endl;

上面代码段中有一个变量cout = 0.2fif(count):如果count不等于0,然后输出接下来的语句。

这样语法上没有任何问题,但是不推荐这种做法。因为在阅读代码的时候,可能会潜意识认为count是一个布尔类型,其实它是一个浮点数。那么比较推荐的做法是什么?if(count != 0)

  • Pointers are also frequently used as conditions

    int * p = new int[1024];
    if (!p) // if(p == NULL)
      cout << "Memory allocation failed." << endl;
    
  • 申请内存,创建一个包含1024个元素的数组,然后将地址赋值给指针p

    1. if(!p):如果pfalse。就会执行下面的语句

因为指针的申请失败的时候,会返回一个空值。空指针的值就是0。当然还是if(p == NULL)的可读性好