【参考课程:B站 BV1cq4y1U7sg BV1Vm4y1r7jY】
目录
//语句项是一些case语句 //要实现分支效果需要搭配break使用
//default子句:写在任意一个case标签可以出现的位置
//相比while循环,for循环将三个关键部分[初始化、判断、调整]集中到一起,便于修改
//break语句--永久的终止循环--与while循环一致
//continue语句--跳过某次循环--与while循环略有差异
*C语言是结构化的程序设计语言:
- 顺序结构
- 选择结构---分支语句
- 循环结构---循环语句
//C语言中用一个 ; 隔开的就是一条语句
1.分支语句(选择结构)
1.1 if
if语句的基本语法结构:
if (表达式) //若表达式结果!=0(为真)--语句执行;若表达式结果==0(为假)--语句不执行
语句;
if (表达式1) //若表达式1结果为真--执行语句1 //为假--执行语句2
语句1;
else
语句2;
if (表达式1) //若表达式1结果为真--执行语句1 //为假--判断表达式2
语句1;
else if (表达式2) //若表达式2结果为真--执行语句2 //为假--执行语句3
语句2;
else
语句3;
//if\else默认只能控制一条语句 ∴有多条语句要括上{}
//C语言中:0表示假,非0表示真
//else与离它最近的if匹配
【练习】
- 判断一个数是否为奇数
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main() { int input = 0; scanf("%d", &input); //用取input的2的余的方式判断奇偶 //若为奇数,input%2!=0 →if为真→运行if语句 //若为偶数,input%2==0 →if为假→运行else语句 if (input % 2) printf("奇数"); else printf("偶数"); return 0; }
1.2 switch
//适用于多分支的语句
基本结构:
switch (整型表达式) //注意类型为 整型 !!
{
语句项
}
//语句项是一些case语句 //要实现分支效果需要搭配break使用
switch (整型表达式)
{
case 整型常量表达式: //case 相当于入口 //注意类型为 整型(常量) !!
语句;
break; //break 相当于出口(可以根据需要不放置出口,使程序接连运行下去)
}
//default子句:写在任意一个case标签可以出现的位置
当switch表达式的值并不匹配所有case标签的值时,就会执行default语句
*每个switch语句只能出现一条default子句
switch (整型表达式)
{
case 整型常量表达式:
语句;
break;
default:
break;
}
【例题】
- 下面代码的运行结果是什么?
#include<stdio.h> int main() { int n = 1; int m = 2; switch (n) //switch参考n值 { case 1: //∵n=1,所以从case 1 进入 m++; //m=2+1=3 case 2: //case 1 无break,∴接着运行case 2 n++; //n=1+1=2 case 3: //无break,接着运行 //switch允许嵌套使用 switch (n) //参考n值,目前n=2 { case 1: n++; case 2: //∴从case 2 进入 m++; //m=3+1=4 n++; //n=2+1=3 break; //break 跳出此{} } case 4: //回到这一级{},继续运行case 4 m++; //m=4+1=5 break; //break 跳出{} default: break; } printf("m = %d, n = %d\n", m, n); //输出m = 5, n = 3 return 0; }
2.循环语句(循环结构)
2.1 while
while语句的基本语法结构:
while (表达式) //表达式成立则执行循环语句
{
循环语句; //每执行完一次语句都返回while()判断真假-以判断是再执行一次语句还是跳出这个循环
}
while循环的三个关键部分:
#include<stdio.h>
int main()
{
int i = 0; //初始化
while (i <= 10) //判断部分
{
printf("%d ", i);
i++; //调整部分
}
return 0;
}
//break语句--永久的终止循环
while (表达式1)
{
if (表达式2) //当表达式2为真,直接跳出该循环
break;
循环语句; //若表达式2为假,执行循环语句后返回判断表达式1
}
//continue语句--跳过某次循环
while (表达式1)
{
if (表达式2) //当表达式2为真,
语句1; //执行语句1,
continue; //跳过本次循环continue之后的代码(此处即不执行循环语句2),直接返回判断表达式1;
循环语句2; //若表达式2为假,执行循环语句后返回判断表达式1。
}
*注意while循环中continue可能存在跳过调整部分陷入死循环的问题--for循环则没有这个隐患
【例题】
- 解释程序:
int main() { int ch = 0; //创建一个整型变量ch //getchar() 获取一个字符 //EOF-文件结束标志(end of file) //EOF通常用-1表示 //把获取到的字符的ASCII值赋给ch while ((ch = getchar()) != EOF) //若输入字符非EOF/即:输入字符存在 { //输出该字符 //若EOF则跳出循环结束程序 //ctrl+Z 可以结束该程序 putchar(ch); //putchar()函数的作用是将单个字符输出到标准输出流(通常是屏幕) } return 0; }
//EOF-文件结束标志(end of file) ,本质是-1
//getchar是一个C语言标准库函数,用于从标准输入(通常是终端或控制台)获取一个字符。它在程序中通常用于逐个读取用户输入的字符或从文件中读取字符。
putchar函数的作用是将单个字符输出到标准输出流(通常是屏幕)
//getchar和putchar的返回值类型为整型int(输入字符的ASCII值)
//由于getchar和putchar都是输出单个字符,所以需要书写循环语句来支持输出多个字符
- 输入并确认密码
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main() { char password[20] = {0}; printf("请输入密码:\n"); scanf("%s", password); //*字符串名本质为字符串第一个字符的地址∴此处不需要再加上操作符&取地址 //清理缓冲区 //使用循环语句以防缓冲区不只一个字符 int tmp = 0; while ((tmp = getchar()) != '\n') //当缓冲区为\n时跳出 //此处getchar取走缓冲区字符 { ; //空语句,即getchar取走缓冲区字符但不进行包括储存的任意操作→即相当于清理丢弃了该字符 } printf("请确认密码是否正确(Y/N):%s\n", password); int ch = getchar(); if (ch == 'Y') { printf("确认成功!\n"); } else { printf("确认失败:(\n"); } return 0; }
回车\n 会触发scanf读取缓冲区信息,但scanf不会取走 \n
回车\n 也会触发getchar读取缓冲区信息,只读取一个字符,且getchar会取走 \n
*scanf 空格问题
//scanf在输入带空格的字符串时会在空格处停止扫描
2.2 for--最常用的循环语句
基本结构:
for (表达式1-初始化; 表达式2-判断部分; 表达式3-调整部分)
{
循环语句;
}
for循环的三个关键部分均可省略: //建议不要省略!
- 若省略判断部分:默认判断结果恒为真--导致死循环
//相比while循环,for循环将三个关键部分[初始化、判断、调整]集中到一起,便于修改
#include<stdio.h>
int main()
{
int i = 0;
//输出1~10
for (i = 1; i <= 10; i++)
{
printf("%d ", i);
}
return 0;
}
*执行顺序:
初始化→判断部分
//真→执行循环语句→调整部分→判断部分(下一次循环)...
//假→跳出循环
*for循环特点:初始化部分只执行一次
//break语句--永久的终止循环--与while循环一致
for (表达式1-初始化; 表达式2-判断部分; 表达式3-调整部分)
{
if (表达式4) //若表达式4为真,则直接跳出,结束循环
break;
循环语句;
}
//continue语句--跳过某次循环--与while循环略有差异
for (表达式1-初始化; 表达式2-判断部分; 表达式3-调整部分)
{
if (表达式4) //若表达式4为真,则跳过continue之后的语句,返回调整部分,接着进入(下一次循环前的)判断部分
continue;
循环语句;
}
*for循环中的continue跳过循环语句,返回调整部分,调整后再进入下一次循环的判断部分--区分于while循环
//for循环支持控制两组变量
#include<stdio.h>
int main()
{
int x = 0;
int y = 0;
for (x = 1, y = 1; x < 6 && y < 5; x+= 2, y++) //&&-逻辑与
{
printf("%d ", x+y);
}
return 0;
}
编写for循环的建议:
- 不要在for循环体内修改循环变量,放置for循环失去控制
- 建议for语句的循环控制变量的取值采用“前闭后开区间”写法。(代码风格更好)
【例题】
- 请问该循环要循环多少次?
int main() { int i = 0; int k = 0; for (i = 0, k = 0; k = 0; i++, k++) //此处判断部分把0赋值给k了(注意这里只有一个‘=’!!)→判断为假,直接跳出 //循环0次 { k++; } return 0; }
2.3 do while--不常用
基本结构
初始化
do
{
循环语句;
调整部分;
} while (判断部分); //***注意此处while()后要加 ;
//do while循环先执行后判断 ∴循环至少会执行一次
#include<stdio.h>
int main()
{
//输出1-10
int i = 1; //初始化
do
{
printf("%d ",i); //循环语句
i++; //调整部分
} while (i <= 10); //判断部分 //注意“先执行后判断”对判断部分的取值范围最终的效果影响
return 0;
}
//break语句
初始化
do
{
if (表达式) //若表达式为真--直接跳出循环
break;
循环语句;
调整部分;
} while (判断部分); //***注意此处while()后要加 ;
//continue语句--与while语句相似
初始化
do
{
if (表达式) //若表达式为真--跳过continue后的语句进入判断部分
continue;
循环语句;
调整部分;
} while (判断部分); //***注意此处while()后要加 ;
*可能会跳过调整部分陷入死循环