循环结构和选择结构

if else 语句
1
2
3
4
5
if(判断条件){
语句块 1
}else{
语句块 2
}

例:

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
int main()
{
int a, b, max;
printf("输入两个整数: ");
scanf("%d %d", &a, &b);
if (a>b) max = a;
else max = b;
printf("%d和%d的较大值是: %d\n", a, b, max);
return 0;
}

运行结果:
输入两个整数: 34 28↙
34 和 28 的较大值是: 34

只使用 if 语句
1
if(判断条件){ 语句块 }

只使用 if 语句来求两个数中的较大值:

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
int main()
{
int a, b, max;
printf("输入两个整数: ");
scanf("%d %d", &a, &b);
max = b; // 假设b最大
if (a>b) max = a; // 如果a>b,那么更改max的值
printf("%d和%d的较大值是: %d\n", a, b, max);
return 0;
}

运行结果:
输入两个整数: 34 28
34 和 28 的较大值是: 34

多个 if else 语句
1
2
3
4
5
6
7
8
9
10
11
if(判断条件 1){
语句块 1
} else if(判断条件 2){
语句块 2
}else if(判断条件 3){
语句块 3
}else if(判断条件 m){
语句块 m
}else{
语句块 n
}

例:

使用多个 if else 语句判断输入的字符的类别

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
int main() {
char c;
printf("Input a character:");
c = getchar();
if (c<32)
printf("This is a control character\n");
else if (c >= '0'&&c <= '9')
printf("This is a digit\n");
else if (c >= 'A'&&c <= 'Z')
printf("This is a capital letter\n");
else if (c >= 'a'&&c <= 'z')
printf("This is a small letter\n");
else
printf("This is an other character\n");
return 0;
}

运行结果:
Input a character:e↙
This is a small letter

if 语句的嵌套
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
int main() {
int a, b;
printf("Input two numbers:");
scanf("%d %d", &a, &b);
if (a != b) { //!=表示不等于
if (a>b) printf("a>b\n");
else printf("a<b\n");
}
else {
printf("a=b\n");
}
return 0;
}

运行结果:
Input two numbers:12 68
a<b

if 语句嵌套时,要注意 if 和 else 的配对问题。 C 语言规定, else 总是与它前面最近的 if 配对,例 :

1
2
3
if (a != b) // ①
if (a>b) printf("a>b\n"); // ②
else printf("a<b\n"); // ③

③和②配对,而不是和①配对 。

C 语言逻辑运算符

\1) 与运算(&&)
参与运算的两个表达式都为真时,结果才为真,否则为假。例如:
5&&0
5 为真, 0 为假,相与的结果为假,也就是 0。
(5>0) && (4>2)
5>0 的结果是 1,为真, 4>2 结果是 1,也为真,所以相与的结果为真,也就是 1。
\2) 或运算(||)
参与运算的两个表达式只要有一个为真,结果就为真;两个表达式都为假时结果才为假。例如:
10 || 0
10 为真, 0 为假,相或的结果为真,也就是 1。
(5>0) || (5>8)
5>0 的结果是 1,为真, 5>8 的结果是 0,为假,所以相或的结果为真,也就是 1。
\3) 非运算(!)
参与运算的表达式为真时,结果为假;参与运算的表达式为假时,结果为真。例如:
!0
0 为假,非运算的结果为真,也就是 1。
!(5>0)
5>0 的结果是 1,为真,非运算的结果为假,也就是 0。

优先级

逻辑运算符和其它运算符优先级从低到高依次为:
赋值运算符(=) < &&和|| < 关系运算符 < 算术运算符 < 非(!)
&& 和 || 低于关系运算符, ! 高于算术运算符。
按照运算符的优先顺序可以得出:
a>b && c>d 等价于 (a>b)&&(c>d)
!b==c||d<a 等价于 ((!b)==c)||(d<a)
 a+b>c&&x+y<b 等价于 ((a+b)>c)&&((x+y)<b)
另外,逻辑表达式也可以嵌套使用,例如 a>b && b || 9>c, a || c>d && !p。

switch case 语句
1
2
3
4
5
6
7
switch(表达式){
case 整型数值 1: 语句 1;
case 整型数值 2: 语句 2;
......
case 整型数值 n: 语句 n;
default: 语句 n+1;
}
条件运算符(? :)

语法格式:

1
表达式 1 ? 表达式 2 : 表达式 3

如果表达式 1 的值为真,则以表达式 2 的值作为
整个条件表达式的值,否则以表达式 3 的值作为整个条件表达式的值。条件表达式通常用于赋值语句之中。

例:

1
2
3
4
5
6
if (a>b) {
max = a;
}
else {
max = b;
}

等价于

1
max = (a>b) ? a : b;

使用条件表达式时,还应注意以下几点:
\1) 条件运算符的优先级低于关系运算符和算术运算符,但高于赋值符。因此
max=(a>b) ? a : b;
可以去掉括号而写为
max=a>b ? a : b;
\2) 条件运算符?和:是一对运算符,不能分开单独使用。
\3) 条件运算符的结合方向是自右至左。例如:
a>b ? a : c>d ? c : d;

应理解为:
a>b ? a : ( c>d ? c : d );
这也就是条件表达式嵌套的情形,即其中的表达式又是一个条件表达式。

while 循环
1
2
3
4
while(表达式)
{
语句块
}

意思是,先计算“表达式”的值,当值为真(非 0)时, 执行“语句块”;执行完“语句块”,再次计算表达式的值,如果为真,继续执行“语句块”……这个过程会一直重复,直到表达式的值为假(0),就退出循环,执行 while后面的代码。

do-while 循环
1
2
3
do{
语句块
}while(表达式);

do-while 循环与 while 循环的不同在于:它会先执行“语句块”,然后再判断表达式是否为真,如果为真则继续循环;如果为假,则终止循环。因此, do-while 循环至少要执行一次“语句块”。

for 循环
1
2
3
for(表达式 1; 表达式 2; 表达式 3){
语句块
}

它的运行过程为:
\1) 先执行“表达式 1”。
\2) 再执行“表达式 2”,如果它的值为真(非 0),则执行循环体,否则结束循环。
\3) 执行完循环体后再执行“表达式 3”。
\4) 重复执行步骤 2) 和 3),直到“表达式 2”的值为假,就结束循环。

break 关键字

当 break 关键字用于 while、 for 循环时,会终止循环而执行整个循环语句后面的代码。 break 关键字通常和 if 语句一起使用,即满足条件时便跳出循环 。

例:使用 while 循环计算 1 加到 100 的值:

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
int main() {
int i = 1, sum = 0;
while (1) { //循环条件为死循环
sum += i;
i++;
if (i>100) break;
}
printf("%d\n", sum);
return 0;
}

运行结果:5050
while 循环条件为 1,是一个死循环。当执行到第 100 次循环的时候,计算完 i++;后 i 的值为 101,此时 if 语句的条件 i> 100 成立,执行 break;语句,结束循环。

在多层循环中,一个 break 语句只向外跳一层。

continue 语句

continue 语句的作用是跳过循环体中剩余的语句而强制进入下一次循环。 continue 语句只用在 while、 for 循环中,常与 if 条件语句一起使用,判断条件是否成立。