前面着重介绍不同的数据类型,实际的程序还需要流程。这个流程里面可能有分支,也可能有循环等等。首先先展示if语句的语法内容。
if
if语法就是说按照条件去执行代码。我们来看这个最简单的例子。
int num = 10;
if (num < 5)
cout << "The number is less than 5. " << endl;
我们首先有一个变量num
,并赋初始值为10。第二行为一个if
语句,当if num < 5
,满足这个条件那么就执行如下代码:cout << "The number is less than 5. " << endl;
,打印一个字符串。这个就是一个最简单的if语句。
if (num == 5 )
{
cout << "The number is 5." << endl;
}
else
cout << "The number is not 5." << endl;
那么如果稍微复杂一点点:上面代码有一个条件,但是有两个分支。if
这个条件满足的话,那就打印cout << "The number is 5." << endl;
。如果这个条件不满足,也就是else这个部分就会被执行。
:::warning
当判断语句的要执行代码只有一行的话,可以不用括号。如果有多行,那一定要加上{}
。
:::
if (num < 5)
cout << "The number is less than 5." << endl;
else if (num > 10)
cout << "The number is greater than 10." << endl;
else
cout << "The number is in range [5, 10]." << endl;
上述代码中有三个分支,两个if条件。
if(num < 10)
if(num < 5)
cout << "The number is less than 5" << endl;
else
cout << "Where I'm?" << endl;
if语句也是可以嵌套的。上述代码中只有当num < 10
的情况下,才会执行下面代码。之后在if语句中又嵌套了一个if语句,条件是num < 5
。
上述代码中有一个问题:代码故意没有缩进,但语法上缩进与否的结果是没有区别的。那么对于这个例子,else
是和第一个还是第二个if
的匹配呢?
:::info
语法里规定:如果没有花括号隔离,那么else
跟最近的if
配对。
:::
虽然上述代码语法是对的,但是在实际编译的时候,大部分编译器可能会给一个警告:提示这样写代码很容易混淆。所以为了代码好阅读、好维护,最好是加上了括号
三目运算符 ? :
operator
我们先来看一个if-else的例子。
bool isPositive = true;
int factor = 0;
//some operations may change isPositive's value
if(isPositive)
factor = 1;
else
factor = -1;
在这个例子里面呢,有个bool类型变量isPositive
,还有一个整数变量 factor
。该代码块的功能:如果isPositive
是true,系数赋值为1;如果isPositive
是False,系数就为-1。其实实现的是一个赋值操作,不同的条件赋不同的值。在这种条件下,你可以用if-else来做,但还有一个更简洁的写法,用这个三元运算符。
factor = isPositive ? 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语句中,谈到如果条件成立就怎么样,条件不成立怎么样,到底什么是条件呢?
上图就是刚才的例子。如果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.
如果这个表达式的条件是成立的,比如a
跟b
相等,那么这个表达式(条件)为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.2f
。if(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
。if(!p)
:如果p
是false
。就会执行下面的语句
因为指针的申请失败的时候,会返回一个空值。空指针的值就是0。当然还是if(p == NULL)
的可读性好