C语言是结构化的程序设计语言,结构指顺序结构、选择结构、循环结构。

分支语句

if语法格式

1
2
if(表达式)
语句


C语言中,非0为真,0为假。

1
2
3
4
5
int num = 0;
scanf("%d", &num);
if (num % 2 == 1)
print("%d 是奇数\n",num);
return 0;

else

判断是与不是的情况

1
2
3
4
if(表达式)
语句1
else
语句2
1
2
3
4
5
6
7
   
int num = 0;
scanf("%d", &num);
if (num % 2 == 1)
printf("%d 是奇数\n", num);
else
printf("%d 是偶数\n", num);

分支中包含多条语句

C语言中默认 if 和 else 后只跟一条语句,想跟多条需

要使用 {} 。

1
2
3
4
5
6
7
8
9
10
11
12
int age = 0;
scanf("%d", &age);
if (age >= 18)
{
printf("你已经成年了\n");
printf("可以去上网了\n");
}
else
{
printf("你是个儿童\n");
printf("不能去上网\n");
}

if 嵌套

在 if…else 语句中, else 可以与另一个 if 语句连用,构成多重判断。

1
2
3
4
5
6
7
8
9
int num = 0;
scanf("%d", &num);
if (num > 0)
printf("%d 是正数\n", num);
else if (num < 0)
printf("%d 是负数\n", num);
else
printf("%d 是零\n", num);
return 0;
1
2
3
4
5
6
7
8
9
10
11
12
13
int num = 0;
scanf("%d", &num);
if (num > 0)
{
if (num % 2 == 1)
printf("%d 是正奇数\n", num);
else
printf("%d 是正偶数\n", num);
}
else
{
printf("%d 是非正数\n", num);
}

else 的悬空问题

else 总是与最接近的 if 匹配

1
2
3
4
5
6
7
int a = 0;
int b = 2;
if (a == 1)
if (b == 2)
printf("hehe\n");
else
printf("haha\n");

这里 else 与 是与 if(b == 2) 匹配 所以结果是什么代码运行结果是什么都没有。

如果想要 else 与 if (a == 1) 相匹配,可以使用{}。

1
2
3
4
5
6
7
8
9
10
int a = 0;
int b = 2;
if (a == 1)
{
if (b == 2)
printf("hehe\n");
}

else
printf("haha\n");

关系操作符

C语言中用于比较的表达式成为关系表达式,使用的运算符就称为关系运算符。

主要有以下六个:

1
2
3
4
5
6
> // 大于运算符
< // 小于运算符
>= // 大于等于运算符
<= // 小于等于运算符
== // 等于运算符
!= // 不等运算符

关系表达式通常返回的是 0 或 1。

需要注意的是关系运算符不宜连用。

1
2
3
4
5
int num = 0;
if (18 <= num <= 20)
{
printf("haha\n");
}

在上述代码中,执行逻辑是先判断 18 <= 0 返回为 0,然后再比较 0 <= 20 ,为

真,所以执行了语句。

正确写法应使用逻辑运算符,在后文中会说明。

条件操作符

也叫三目操作符,需要三个操作数,形式如下:

1
exp1 ? exp2 :exp3  

计算逻辑如图:

1
2
3
4
5
int a = 0;
int b = 0;
scanf("%d", &a);
b = a > 5 ? 3 : -3;
printf("%d\n", b);

逻辑操作符

逻辑操作符提供逻辑判断功能。主要如下:

1
2
3
4
!:逻辑取反(改变单个表达式的真假)
&&:逻辑与,两侧表达式都为真,则为真,否则为假
||:逻辑或,两侧表达式有一个是真则为真,否则为假

! 逻辑取反

1
2
3
4
5
int flag = 0;
if (!flag)
{
printf("do something\n");
}

&& 逻辑与

1
2
3
4
5
6
7
int a = 0;
int b = 0;
scanf("%d%d", &a, &b);
if (a > 0 && b > 0)
{
printf("a和b都是正数\n");
}

|| 逻辑或

1
2
3
4
5
6
7
int a = 0;
int b = 0;
scanf("%d%d", &a, &b);
if (a > 0 || b > 0)
{
printf("a和b至少有一个是正数\n");
}

短路

C语言逻辑运算符总是对左侧的表达式求值,再对右侧的表达式求值。

如果左侧表达式满足逻辑运算符的条件,则不再对右侧表达式求值,这种现象称

为短路。

1
2
3
4
5
6
7
int a = 0;
int b = 1;
if (a > 1 && ++b)
{
printf("hehe\n");
}
printf("%d\n", b);

这里可以看到 b 的值还是1 ,说明发生了短路,++b 没有执行。

像这种仅仅根据左操作数的结果就能知道整个表达式的结果,不再对右操作数进

行计算的运算称为短路求值。

switch 语句

C语言还提供了 switch 来实现分支结构。

switch 语句 是一种特殊形式 if…else 语句。用于判断条件有多个结果的情况。

1
2
3
4
5
switch (expression) {
case value1: statement
case value2: statement
default: statement
}

根据表达式 expression 表达式的值来执行不同的 case 分支。如果没找到对应值

执行 defaultt 分支。

switch 后的 expression 必须是整型表达式。

case 后的值,必须是整型表达常量。

if 语句和 switch 语句的对比

1
2
3
4
5
6
7
8
9
10
int n = 0;
scanf("%d", &n);
if (n % 3 == 0)
printf("整除,余数为0\n");
else if (n % 3 == 1)
printf("余数是1\n");
else
{
printf("余数是2\n");
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
int n = 0;
scanf("%d", &n);
switch (n % 3)
{
case 0:
printf("整除,余数为0\n");
break;
case 1:
printf("余数是1\n");
break;
case 2:
printf("余数是2\n");
break;
}

case 和后边的数字之间必须有空格。

case 语句的代码后加上 break ,才能跳出这个 switch 语句。 否则会出现穿透现

象。

switch 语句中的穿透现象

1
2
3
4
5
6
7
8
9
10
11
int n = 0;
scanf("%d", &n);
switch (n % 3)
{
case 0:
printf("整除,余数为0\n");
case 1:
printf("余数是1\n");
case 2:
printf("余数是2\n");
}

某一个 case 后没有跟 break ,代码就会继续往下执行。直到遇到其他 case 中的

break 或 switch 语句结束。

switch 语句中的 default

当 switch 后边的 expression 中的结果与任意 case 中的值都不匹配的时候,就会

默认执行 default 后的语句。

switch 语句中 case 和 default

C语言中并没有硬性规定 case 和 default 的顺序,通常写法是将 default 放在最

后。

while 循环

语法格式

1
2
while(表达式)
语句

执行流程如图

首先执行判断表达式,表达式值为0。循环结束,不为0则执行循环语句,语句执

行完再重复上述过程。

while 循环示例

1
2
3
4
5
6
7
8
//输入一个整数,逆序打印他
int num = 0;
scanf("%d", &num);
while (num)
{
printf("%d", num % 10);
num /= 10;
}

for 循环

语法格式

1
2
for(表达式1;表达式2;表达式3)
语句

表达式1 用于循环变量的初始化
表达式2 用于循环结束的条件判断
表达式3 用于循环变量的调整。

执行流程如图

for 循环示例

1
2
3
4
5
6
// for循环打印1-10
int i = 0;
for (i = 1;i <= 10;i++)
{
printf("%d\n", i);
}

do-while 循环

语法格式

1
2
3
do
语句
while(表达式);

do-while 是先进入循环体执行一次语句,再进行判断是否进行循环。

执行流程如下:

do-while 中循环体至少执行一次。

示例如下:

1
2
3
4
5
6
7
8
// do-while循环打印1-10
int num = 1;
do
{
printf("%d\n", num);
num++;
}while(num <= 10);
return 0;

break 和 continue 语句

C语言中提供了 break 和 continue 两个关键字。

在循环中,break 的作用是永久终止该循环。

continue 是跳过本次循环位于 continue 之后的代码。

break 示例

1
2
3
4
5
6
7
8
int i = 1;
while (i <= 10)
{
if (i == 5)
break;
printf("%d ", i);
i = i + 1;
}

在 i 的值为 5 时,break 执行,永久终止了这个循环。

continue 举例

1
2
3
4
5
6
7
8
int i = 1;
while (i <= 10)
{
if (i == 5)
continue;
printf("%d ", i);
i = i + 1;
}


当 i 等于 5 后,就执行 continue,直接跳过 continue后的代码,去循环的判断的

地方。因为里跳过了i = i+1,所以i一直为5,程序陷入和死循环。

goto 语句

C语言提供了 goto 语句 和 跳转标号,可以实现在同一个函数内跳转到设置好的标号处。

1
2
3
4
5
6
7
8
9
10
11
12
   	// goto语句的使用
int i = 1;
while (i <= 10)
{
if (i == 5)
goto label;
printf("%d ", i);
i = i + 1;
}
label:
return 0;

语句如果使用的不当,就会导致在函数内部随意乱跳转,打乱程序的执行流程。需谨慎使用。