控制语句
1.控制语句
什么是语句
语句可以理解为计算机指令
在C语言中,语句分为 表达式语句, 函数调用语句, 控制语句, 复合语句, 和空语句
#include <stdio.h>
void test()
{
; // 空语句
}
int main()
{
int a = 1;
int b = 2;
a + b; // 表达式语句
test(); // 函数调用语句
if (a == 1) //控制语句
printf("a = 1");
if (b == 2)
{
printf("b == 2"); //复合语句
}
return 0;
}
什么是控制语句
C语句是一门结构化的计算机语言
这里的结构化是指,C语言支持3种程序结构 顺序,分支(选择),循环结构
在C语言中实现控制语句,实现3种程序结构,控制程序的执行流程
顺序结构,从上到下执行语句
分支结构,条件成立执行语句
循环结构,重复执行语句,直到条件不成立停止
#include <stdio.h>
void test1() // 顺序
{
printf("test\n");
printf("test\n");
printf("test\n");
}
void test2() // 分支
{
int age = 18;
if (age >= 18)
{
printf("成年\n");
}
else
{
printf("未成年\n");
}
}
void test3() // 循环
{
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", i);
}
printf("\n");
}
int main()
{
test1();
test2();
test3();
return 0;
}

顺序,分支,循环可解所有问题?
程序员使用计算机语言编写程序,解决实际生活中的问题
但是,世界上的问题纷繁复杂,3种结构足够解决,描述所有的问题吗
计算机科学家,通过高度抽象,证明在一个单入口,单出口的程序中,所有的问题都可以用3种程序结构中的一种,或组合进行描述
#include <stdio.h>
int main()
{
return 0;
}
在C语言中,main主函数作为一个程序的入口, return 0 作为程序出口
在一个工程中,通常有多个以.c为后缀的源程序,这些源程序中只能有一个主函数,作为整个程序的入口
控制语句分类
C语言中,有9种控制语句,可分为三类 分支,循环,转向语句
分支 - if, switch语句
循环 - for, while, do...while语句
转向 - continue, break, return, goto语句
2. 分支语句
什么是分支
分支,即选择
如果条件成立,就执行什么
3. if 语句
语法
if (条件表达式)
语句;
条件表达式不等于0, 条件表达式为真,执行语句
注:在C语言中,0表示假,非0表示真
例子:
// 判断一个数是否为奇数
#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
if (n % 2 != 0)
printf("奇数\n");
return 0;
}

3 余 2 不等于 0, 表达式为真,执行语句打印奇数
复合语句
if (条件表达式)
语句;
注意 : 这里只能执行一条语句, 如果执行多条语句,需要使用复合语句{ }
// 判断一个数是否为奇数
#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
if (n % 2 != 0)
{
// 复合语句
printf("奇数\n");
printf("test\n");
}
return 0;
}

else 子句
if 语句通常与else子句一起使用
例子:
// 判断一个数是否为奇数
#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
if (n % 2 != 0)
{
printf("奇数\n");
}
else
{
printf("偶数\n");
}
return 0;
}

4 % 2 = 0, 表达式为假,执行 else语句, 打印偶数
else if
使用 else if,实现多分支的情况
else if ( 条件表达式 )
语句;
例子:
#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if (age < 18)
{
printf("少年\n");
}
else if (age >= 18 && age < 30)
{
printf("青年\n");
}
else if (age >= 30 && age < 50)
{
printf("中年\n");
}
else
{
printf("老年\n");
}
}


4. switch
在C语言中,也可以使用switch语句实现分支结构, switch通常用于实现多分支
语法
switch(常量表达式)
{
case 整形常量表达式:
语句;
}
例子:
#include <stdio.h>
int main()
{
int n = 1;
switch (n)
{
case 0:
printf("a");
case 1:
printf("b");
case 2:
printf("c");
}
}

n = 1, case 1 为真,打印b,然后打印c
break
在之前的例子中可以发现,当case 1成立, 执行完语句后,会直接执行case 2中的语句
所以,在使用switch语句时,通常会使用转向语句break, 跳出switch语句
#include <stdio.h>
int main()
{
int n = 1;
switch (n)
{
case 0:
printf("a");
break;
case 1:
printf("b");
break;
case 2:
printf("c");
break;
}
}
![]()
default
当所有表达式都不成立时,默认执行default子句
#include <stdio.h>
int main()
{
int n = 5;
switch (n)
{
case 0:
printf("a");
break;
case 1:
printf("b");
break;
case 2:
printf("c");
break;
default:
printf("输入错误\n");
}
}

5. 循环语句
什么是循环
循环,重复执行,直到条件不成立停止
循环的必要条件
如果使用循环,必须要确定循环可以停止,不陷入死循环
循环中,必须要有一个部分进行判断,条件不成立时,跳出循环,还必须要有一个调整部分,每一个执行,接近这条件,最后退出循环
6. while, for 循环
语法
while(表达式)
语句;
for (表达式1, 表达式2, 表达式3)
语句;
例子:
// while 打印 1 - 10
#include <stdio.h>
int main()
{
int i = 1; //初始化
while (i < 10) // 判断
{
printf("%d ",i);
i++; // 调整
}
printf("\n");
}
// for 打印 1 - 10
#include <stdio.h>
int main()
{
for (int i = 1; i <= 10; i++) //初始化; 判断; 调整
{
printf("%d ", i);
}
}
执行流程

// 打印 1 - 3
#include <stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 3; i++)
{
printf("%d ", i);
}
}

1. 初始化部分, i = 1
2. 判断,1 <= 3, 表达式为真, 执行语句, 打印 1
3. 调整部分, i ++, i = 2
4. 判断,2 <= 3, 为真, 打印2
5. 以此, 当i = 4时, 条件表达式为假,退出循环
7. 循环应用
#include <stdio.h>
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable : 4996)
int main()
{
char passwd[20] = { 0 };
char ch = 0;
printf("输入密码: ");
scanf("%s", passwd); //123456 abc\n
// 清除缓冲区
while (getchar() != '\n')
{
;
}
printf("确认密码(Y/N): ");
ch = getchar();
if (ch == 'Y')
{
printf("确认成功\n");
}
else
{
printf("确认失败\n");
}
}

scanf函数只会从输入缓冲区中,读取字符串123456
此时,输入缓冲区中还有abc\n
如果不清除缓冲区,字符变量ch就会直接从缓冲区中取值,ch = 'a', 导致程序逻辑错误
#include <stdio.h>
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable : 4996)
int main()
{
char passwd[20] = { 0 };
char ch = 0;
printf("输入密码: ");
scanf("%s", passwd); //123456 abc\n
// 清除缓冲区
/*while (getchar() != '\n')
{
;
}*/
printf("确认密码(Y/N): ");
ch = getchar();
if (ch == 'Y')
{
printf("确认成功\n");
}
else
{
printf("确认失败\n");
}
}

浙公网安备 33010602011771号