1.分支结构
IF ELSE语句称之为分支语句, if 和 else 是两个新的关键字,if 意为“如果”,else 意为“否则”,用来对条件进行判断,并根据判断结果执行不同的语句。总结起来,if else 的结构为:
if(判断条件){
语句块1
}else{
语句块2
}
如果判断条件成立,那么执行语句块1,否则执行语句块2 。
如果判断条件成立,那么执行语句块1,否则执行语句块2 ,其执行过程如上图所示。
分支结构的条件判断需要学习关系运算符和逻辑运算符。
2.逻辑表达式
包括 if 语句在内的某些 C 语句(while,for 等)都必须测试表达式的值是“真”还是“假”。
许多编程语言中,类似 i < j
这样的表达式都具有特殊的“布尔”类型或者“逻辑”类型(C++ 的 bool 和 Java 的 boolean)。这样的类型只有两个值,即真(true)和假(false)。
而在 C 语言中,诸如 i < j
这样的比较会产生整数:0(假)1(真)。
但是,非 0 的其他数也可以表示 真。在今天看来,这是 C 语言设计的弊端,它将布尔类型与整型混为一谈,让我们在变成过程中可能稍不小心就会给自己挖一个坑。
2.1 关系运算符
C 语言的关系运算符(relational operator)和数学上的 >,<,≤,≥
相对应,只是用在 C 语言的表达式中时产生的结果是 0 或 1 。
例如,表达式 10 < 11 的值是 1,11 < 10 的值是 0 。
关系运算符也可以用于比较整数和浮点数,也允许比较不同类型的操作数。如:5.6 < 5 的值为 0 。
符号 | 含义 |
---|---|
< | 小于 |
> | 大于 |
<= | 小于等于 |
>= | 大于等于 |
关系运算符的优先级低于算数运算符。例如:i + j < k - 1
的意思是 (i + j) < (k - 1)
关系运算符都是左结合的。
注意: 表达式 i < j < k
在 C 语言中是合法的,但是可能不是你所期望的含义。因为 < 运算符是左结合的,所以这个表达式等价于:(i < j) < k
表达式会先检测 i 是否小于 j,然后用比较后产生的结果(1 或 0 )来和 k 进行比较。这个表达式并不是测试 j 是否位于 i 和 k 之间。(正确的写法是:j > i && j < k
)
2.2 判等运算符
**判等运算符(equality operator):**相等用
==
表示 。注意不是=
,=
表示赋值。
注意:
一定要注意不要将 ==
写成 =
,编译器可能会给你报错,但是如果没有,在你查错的时候,注意是不是 ==
写错了的问题。
符号 | 含义 |
---|---|
== | 等于 |
!= | 不等于 |
和关系运算符一样,判等运算符是左结合的,也是产生 0(假) 或 1(真) 作为结果。
判等运算符的优先级低于关系运算符。例如:
i < j == j < k
等价于:(i < j) == (j < k)
,含义是:如果 i < j 和 j < k 同真或同假 这个表达式的结果为真。
利用 关系运算符 和 判等运算符:
(i >= j) + (i == j)
上面表达式的值为 0,1 或者 2 分别代表 i < j, i > j, i == j
2.3. 逻辑运算符
2.3.1逻辑运算符(logical operator)
符号 | 含义 |
---|---|
! | 逻辑非(一元运算符) |
&& | 逻辑与(二元运算符) |
|| | 逻辑或(二元运算符) |
其实 && 就是 数学中的 且 ,|| 就是数学的的 或
逻辑运算符产生的结果仍然是 0 或 1,操作数经常也是 0 或 1,但这不是必需的。逻辑运算符将任何 非0值操作数当作真来处理,任何0值操作数当作假来处理。
- 如果表达式的值为 0,那么
!表达式
的结果为 1 - 如果 表达式1 和 表达式2 的值都是非零值,那么
表达式1 && 表达式2
的结果为 1 - 如果 表达式1 和 表达式2 的值 中的任意一个是(或者两个都是)非零值,那么
表达式1 || 表达式2
的结果为 1
所有其他情况下,这些运算符产生的结果都为 0
2.3.2 “短路”计算
&& 和 || 运算符都遵循“短路”原则。也就是说,这些运算符首先计算出左操作数的值,然后计算右操作数;
如果表达式的值可以仅由左操作数推导出来,那么将不计算右操作数的值。
例2.1 短路计算
如:
#include <stdio.h>; #include <stdlib.h> #include <string.h> int main() { int i = 0, j = 1; if (i && i++) { ; // 空语句 } printf("%d\n", i); // i 的值没有增加,说明 i++ 没有计算 if (j || j++) { ; } printf("%d\n", j); // j 的值没有增加, 说明 j++ 没有计算 return 0; }
结果
0
1
运算符 !的优先级和一元正负号优先级相同,运算符 && 和 || 的优先级低于判等运算符。
例如:i < j && k == m
等价于 (i < j) && (k == m)
运算符 ! 是右结合的,&& 和 || 是左结合的。
3. IF语句
if
语句用于条件判断,满足条件时,就执行指定的语句。此过程称为“ C”决策
上面式子中,表达式expression
为真(值不为0
)时,就执行statement
语句。
if
后面的判断条件expression
外面必须有圆括号,否则会报错。语句体部分statement
可以是一个语句,也可以是放在大括号里面的复合语句。
下面是一个例子。
例3.1判断一个整数是否是10
#include <stdio.h>; #include <stdlib.h> #include <string.h> int main() { int x; if (x == 10); printf("x is 10"); return 0; }
结果
x is 10
如果有多条语句,就需要把它们放在大括号里面,组成一个复合语句。
例3.2 判断一个整数是否是4,不是4打印一句话
#include <stdio.h>;
#include <stdlib.h>
#include <string.h>
int main()
{
int x;
printf("please input a number that smaller than 10\n");
scanf ("%d",&x);
if (x != 4);{
printf("x is %d\n",x);
printf("please input 4 next time");
}
return 0;
}
please input a number that smaller than 10
6
x is 6
please input 4 next time