进一步的判断和循环

bool类型

  • 在C语言中要使用bool类型的变量,必须使用stdbool.h库函数。
  • 在C语言中没有专门用来输出bool类型的占位符,还是使用%d来作为占位符。
  • C语言中bool类型输出的结果非零即一。

逻辑运算

  • 逻辑运算是对逻辑量进行的运算,结果只有0或1.
  • 逻辑量是关系运算或逻辑运算的结果。
运算符 描述 示例 结果
! 逻辑非 !a 如果a是true结果就是false,如果a是false结果就是true
&& 逻辑与 a && b 如果a和b都是true,结果就是true;否则就是false
|| 逻辑或 a || b 如果a和b有一个是true,结果为true;两个都是false,结果为false

运算符的优先级

优先级 运算符 综合性
1 () 从左到右
2 ! + - ++ – 从右到左(单目的+和-)
3 * / % 从左到右
4 + - / % 从左到右
5 < <= > >= / % 从左到右
6 == != 从左到右
7 && 从左到右
8 || 从左到右
9 = += -= *= /= %= 从右到左
  • &&和||都是短路逻辑运算符,如果左边的结果已经能决定结果了,就不会做右边的计算。
#include<stdio.h>
int main()
{
	int a = 6, b = 1;
	int c, d;
	c = a == 6 && b++ == 1;// 执行完了整个表达式 
	printf("a = %d,b = %d,c = %d\n", a, b, c);
	
	d = a == 6 || b++ == 1;// 只执行了表达式的前半部分 
	printf("a = %d,b = %d,d = %d\n", a, b, d);
	
	return 0;
}

条件运算符

  • 条件运算符的优先级高于赋值运算符,但是低于其他运算符。
  • 条件运算符是自右向左结合的。
  • 条件运算符的格式:w < x ? x : w;
    如果w < x成立,那么输出x,否则输出w。

逗号运算

  • 逗号用来连接两个表达式,并以其右边的表达式的值作为它的运算结果。
  • 逗号的优先级是所有的运算符中最低的,所以它两边的表达式会先计算。
  • 逗号的组合关系是自左向右,所以左边的表达式会先计算,而由边的表达式的值就留下来作为逗号运算的结果。
#include<stdio.h>
int main()
{
	int i = 0, j = 0, k = 0;
	i = (3 + 4, 5 + 6);
	printf("i = %d\n", i);
	
	j = (j + 2, 3 + 8);
	printf("j = %d\n", j);
	
	k = (k + 1, k + 4, k * 4);
	printf("k = %d\n", k);
	
	return 0;
}

级联和嵌套的判断

  • 判断3个数中的最大数:
#include<stdio.h>
int main()
{
	int a, b, c;
	printf("请输入你要比较的3个正整数:");
	scanf("%d %d %d", &a, &b, &c);
	
	int max = 0;
	
	if (a > b)
		if (a > c)
			max = a;
		else
			max = c;
	else
		if (b > c)
			max = b;
		else 
			max = c;
	
	printf("The max is %d\n", max);
	
	return 0;
}
  • 当 if 的条件满足或者不满足的时候要执行的语句也可以是一条 if 或 if-else 与,这就是嵌套的 if 语句。
  • 没有 {…} 的情况下 else 总和最近的 if 相匹配。

多路分支

  • switch-case多路分支语句格式:
    switch (控制表达式) {
    case 常量:
    语句;

    case 常量:
    语句;

    default:
    语句;

    }
  • 控制表达式只能是整数型的结果。
  • 常量可以是常数,也可以是常数计算的表达式,不可以出现变量。
  • switch 语句可以看作是一中基于计算的跳转,计算控制表达式的值后,程序会跳转到向匹配的 case(分支标号)处。分支标号只是说明 switch 内部位置的路标,在执行完分支中的最后一条语句后,如果后面没有 break,就会顺序执行下一个 case 语句,直到遇到一个 break,或者 switch 结束为止。
#include<stdio.h>
int main()
{
	int type;
	printf("请输入type的值:");
	scanf("%d", &type);
	
	switch (type)
	{
		case 1:
			printf("你好!\n");
			break;
		case 2:
			printf("早上好!\n");
			break;
		case 3:
			printf("晚上好!\n");
			break;
		case 4:
			printf("再见!\n");
			break;
		default:
			printf("啊,什么啊?\n");
	}
	
	return 0;
} 
  • 每一个 case 之后都必须带上 break 。

判断和循环常见的错误

  • if 语句常见的错误:
    (1)忘记大括号:永远在 if 后面加上 {…}
    (2)if 后面的分号:if 后面不用写 “;”
    (3)错误使用 == 和 = :==表示相等,= 表示赋值
    (4)用错 else:else 在没有 {}的情况下只和最近的 if 相匹配
  • 循环常见的错误:
    (1)经常会进入死循环
    (2)注意循环的次数以及条件