Whlie循环中的关系表达式
while循环经常依赖测试表达式作比较,这样的表达式被称为关系表达式。
如:while (index < 5),其中的 (index < 5)。
该表达式是一个入口条件,因为必须满足条件,也就是条件为真才能进入循环体。如果条件为假则不能进入循环。
什么是真?
在C中,表达式一定有一个值,关系表达式也不例外。
#include <stdio.h>
int main(void)
{
int true_v, false_v;
true_v = (10 > 2); // 关系为真的值
false_v = (10 == 2); // 关系为假的值
printf("true= %d;false= %d",true_v,false_v);
return 0;
}
程序把两个关系表达式的值分别赋给两个变量,即把表达式为真的值赋给true_v,表达式为假的值赋给false_v。运行该程序后输出如下:
true= 1; false= 0
可以看出,对C而言,表达式为真的值是1,表达式为假的值是0。
一些C程序使用下面的循环结构,由于1为真,所以循环会一直进行。
while(1)
{
...
}
其他真值
既然1或0可以作为while语句的测试表达式,是否还可以使用其他数字?
#include <stdio.h>
int main(void)
{
int n = 3;
while (n){
printf("%2d is true\n", n--);
}
printf("%2d is false\n", n);
n = -3;
while (n){
printf("%2d is true\n", n++);
}
printf("%2d is false\n", n);
return 0;
}
程序的输出结果如下:
3 is true
2 is true
1 is true
0 is false
-3 is true
-2 is true
-1 is true
0-is alse
执行第1个循环时,n分别是3、2、1,当n等于0时,第1个循环结束。与此类似,执行第2个循环时,n分别是-3、-2 和 -1,当n等于0时,第2个循环结束。
得出结论一般而言,所有的非零值都视为真,只有0被视为假。
逻辑运算符
与、或、非三个运算符。
| 符号 | 含义 |
|---|---|
| ! | 逻辑非 |
| && | 逻辑与 |
| || | 逻辑或 |
逻辑运算符产生的结果是 0 或 1。
下面是表达式为1的情况,除此之外,这些运算符产生的结果都是 0 。
逻辑非:如果表达式的值为 0 ,那么表达式的值为 1 。
int a = 0;
if (!a){
//a的值为0,那么表达式 !a 的值为1,所以if条件中内容1,输出Hello
printf("Hello World!");
}
逻辑与:如果表达式1和表达式2的值都是非零值,那么表达式1 && 表达式2的结果为 1 。
int a = 3, b = 2;
if (a==3 && b==2){
//表达式a==3和b==2的值都为非零,所以if条件中内容为1,输出Hello
printf("Hello World!");
}
逻辑或:如果表达式1和表达式2的值中任意一个是(或者两者都是)非零值,那么表达式1 || 表达式2的结果为1。
int z = 0, y = 2;
if (z==3 && y==2){
//尽管z==3为零,但表达式y==2的值为非零就足够时if条件中内容为1,输出Hello
printf("Hello World!");
}
逻辑非在if中的情况
if (a) 等同于 if (a != 0)
if (!a) 等同于 if (a == 0)
&&和||的短路特性
运算符&&的“短路”
int a = 0, b = 0;
//如果表达式 a==1 的值为0,那么将不再计算 b==0 的真假,直接退出if。
if ( a==1 && b==0){
printf("Hello");
}
运算符|| 的"短路"
int a = 0, b = 0;
//如果表达式 a==0 的值为1,那么将不再计算 b==0 的真假,直接进入if内输出hello。
if ( a==0 || b==0){
printf("Hello");
}