语句
C语句可分为以下五类:
1. 表达式语句
2.函数调用语句
3.控制语句
4. 复合语句
5. 空句
本章后面介绍的是控制语句。
控制语句用于控制程序的执行流程,以实现程序的各种结构方式(C语言支持三种结构:顺序结构、选择结构、循环结构),它们由特定的语句定义符组成,C语言有九种控制语句。
可分成以下三类:
1.条件判断语句也叫分支语句:i语句、switch语句:
2.循环执行语句:do whie语句、while语句、for语句:
3.转向语句:break语句、goto语句、continue语句、return语句。
分支语句(选择结构)
if语句
语法结构
单分支
if(表达式)//C语言中:0为假,非0为真 语句;
多分支
if(表达式1) 语句1; else if(表达式2) 语句2; else 语句3;
PS: (18<= age <=30 )是有问题的 C语言中先执行前面 为真则变为1,即只要18这个语句一定正确
(age >= 18 && age <= 30)是真正的写法
嵌套分支
if(表达式1) 语句1; else{ if(表达式2) 语句2; else{ if(表达式3) 语句3; else 语句4; } }
简化 else if 嵌套
if(表达式1) 语句1; else if(表达式2) 语句2; else if(表达式3) 语句3; else if(表达式4) 语句4; else 语句5;
PS:else是和离着最近的else对应
switch语句
比如:
输入1,输出星期一
输入2,输出星期二
输入3,输出星期三
输入4,输出星期四
输入5,输出星期五
输入6,输出星期六
输入7,输出星期日
那我没写成 if...else if ...else if 的形式太复杂,那我们就得有不一样的语法形式。
这就是switch 语句。
switch(整型表达式)
{
语句项
}
int main(){ int day = 0; scanf("%d"&day); switch (day) { case 1: printf("星期1\n"); break; case 2: printf("星期2\n"); break; case 3: printf("星期3\n"); break; case 4: printf("星期4n"); break; case 5: printf("星期5\n"); break; case 6: printf("星期6\n"); break; case 7: printf("星期天\n"); break; } return 0; }
PS:break 才可以实现分支
也可以多个case在一起输出一种结果:
switch (day) { case 1: case 2: case 3: case 4: case 5: printf("weekday\n" ); break; case 6: case 7: printf("weekend \n"); break; }
default: printf("处理除case情况以外的数据"); break;
default 用法如上
int main() { int n = 1; int m = 2; switch (n) { case 1: m++; case 2: n++; case 3: switch (n)//switch 允许嵌套的 { case 1: n++; case 2: m++; n++; break; } case4: m++; break; default: break; } printf("m = %d, n = %d\n", m, n) ; return 0; }
结果输出: 5,3
循环语句
while // for // do while
while语句
语法结构:
while(表达式)
循环句;
循环流程:
expr (evaluate expressions的缩写)。"表达式求值"。
stmt 表示预处理语句。
break和continue是shell脚本中的两个关键字,用于控制循环语句的执行。
break用于跳出循环语句,即使循环条件没有达到结束的条件,也可以强制退出循环。例如,在一个for循环中,如果某个条件满足,就可以使用break语句跳出循环。
continue用于跳过循环中的某个迭代,即使循环条件没有达到结束的条件,也可以跳过当前迭代,继续执行下一次迭代。例如,在一个for循环中,如果某个条件不满足,就可以使用continue语句跳过当前迭代,继续执行下一次迭代。
continue 在while循环中 :跳过本次循环的后边的代码,直接去判断部分,看是否进行下一次判断i
int main(){ int i = 1; while (i <= 10) { i++; if (i == 5) continue; printf("%d " , i); } return 0; }
输出:2 3 4 6 7 8 9 10 11
PS:注意11,当i等于10的时候仍然进入循环,i++变为11,输出,下一次不进入循环。
int main(){ int i = 1; while (i <= 10) { if (i == 5) break; printf("%d " , i); i++; } return 0; }
输出:1 2 3 4
break :while循环中break是永久的终止循环
getchar与putchar
getchar() -- 标准输入流(通常是键盘)中读取一个字符
putchar() --单个字符输出到标准输出流(通常是屏幕)
putchar
和 getchar
是 C 语言的标准库函数,用于字符的输入和输出。
putchar
函数的作用是将单个字符输出到标准输出流(通常是屏幕),其函数原型为:
int putchar(int c);
其中 c
表示要输出的字符,函数返回值为输出的字符的 ASCII 码。
例如,以下代码将字符 'A' 输出到屏幕上:
putchar('A');
getchar
函数的作用是从标准输入流(通常是键盘)中读取一个字符,其函数原型为:
int getchar(void);
函数返回值为读取到的字符的 ASCII 码。例如,以下代码从键盘中读取一个字符,并将其输出到屏幕上:
int c = getchar(); putchar(c);
需要注意的是,getchar
函数每次只能读取一个字符,如果需要读取多个字符,可以通过循环的方式来实现。同时,getchar
函数在读取字符时,遇到换行符('\n')或文件结束符(EOF)会停止读取。
在window系统 按CTRL+Z getchar 返回EOF。
int main(){ int ch = 0; while ((ch = getchar ()) != E0F) { if (ch < '0' || ch > '9' ) continue; putchar (ch); } return 0; }
多组输入 如果是0~9的数字,则putchar执行输出该数字;
如果不是则不输出,继续输出。
ASCII表附上
补充:清空缓冲区的代码
Linux缓冲区是指在内存中开辟的一块区域,用于存储输入输出数据的临时存储区域。当应用程序向文件或设备进行读写操作时,数据会先被存储到缓冲区中,然后再由缓冲区将数据写入磁盘或设备中。缓冲区的作用是提高数据读写的效率,减少磁盘或设备的访问次数,从而提高系统的性能。在Linux系统中,缓冲区的大小可以通过修改内核参数来进行调整。
int main() { char password [20]; printf("请输入密码:>"); scanf ("%s ",password); printf("请确认(Y/N):"); int ch = getchar(); if ('Y' == ch) printf("确认成功\n"); else printf("确认失败\n"); return 0;
数组名本来就是地址 scanf不用取地址
这个代码是直接 确认失败
如果输入密码abcdef->在缓存区是 abcdef\n -> getchar直接读取\n 直接确认失败
getchar();//处理\n
int main() { char password [20]; printf("请输入密码:>"); scanf ("%s ",password); //scanf函数在读取数据字符串的时候,遇到空格就不再读取 getchar();//处理\n printf("请确认(Y/N):"); int ch = getchar(); if ('Y' == ch) printf("确认成功\n"); else printf("确认失败\n"); return 0;
这个代码是如果密码有空格还是 确认失败
如果输入密码abcdef ddddd->在缓存区是 abcdef ddddd\n -> scanf读取 abcdef 遇到空格就不读取
getchar读取( ddddd) 直接确认失败
while((ch = getchar())!= '\n')
{;}//空语句
int main() { char password [20]; printf("请输入密码:>"); scanf ("%s ",password); //scanf函数在读取数据字符串的时候,遇到空格就不再读取 while((ch = getchar())!= '\n') {;}//空语句 printf("请确认(Y/N):"); int ch = getchar(); if ('Y' == ch) printf("确认成功\n"); else printf("确认失败\n"); return 0;
通过while循环用getchar处理掉包括\n之前的全部内容->然后通过Y/N判断确认
这个代码是最终可以解决
for语句
语法:
for(表达式1;表达式2;表达式3)
循环语句;
表达式1:初始化部分
表达式2:判断部分
表达式3:调整部分
int main(){ int i = 0; for(i = 1; i <= 10; i++){ printf("%d",i); } return 0; }
流程:
continue: 在for循环中会跳过continue后面的代码,直接取循环的调整部分
与while中的continue有些区别(while中是否跳过调整部分,看调整部分的位置)
break:在for中也是直接终止循环(和break在while中一样)
关于循环变量的建议:
不可在for 循杯体内修改循环変量,防止 for 循坏失去控制。(不要写单= 进行赋值)
建议for语句的循环控制变量的取值采用"前闭后开区间"写法。
一些for循环的变种:
初始化,判断,调整三个部分都可以省略
for(;;){ }
但调整部分被省略,会变成死循环。
int main(){ int i = 0; int j = 0; for (; i < 3; i++){ for (; j < 3 ;j++){ printf("hehe\n"); } } return 0; }
只能打印三个hehe
因为第一次循环之后 j就变成3了
//请问循环要循环名少次? #include <stdio.h> int main(){ int i = 0; int k = 0; for(i =0, k=0; k=0; i++, k++) k++; return 0; }
循环执行0次
判断语句中是赋值语句 k=0 直接为假 不执行循环。