C语言控制语句
引言:从程序流程的角度看,C语言语句可分为三种基本结构:顺序结构、分支结构、循环结构。顺序结构就是逐条执行各条语句。分支语句会进行判断,选择支路执行语句。循环语句在没有满足终止条件时,会重复某段内容。
一、分支语句
1.1 if-else语句
if else语句分三种形式,分别是简化形式,阶梯形式,嵌套形式,用代码演示3种情况,实现分数判断分类,90-100为A,80-90为B,50-80为C,0-50为D。如下代码所示:
/*
* @Description: 演示三种类型if-else语句
* @Author: 余红祥
* @Date: 2022-07-01 21:18:58
* @LastEditTime: 2022-07-01 21:28:18
* @LastEditors:
*/
#include <stdio.h>
int main(int argc, char const *argv[])
{
int grade = 0;
printf("please enter grade:\n");
scanf("%d", &grade);
/*演示1:简化形式演示*/
if (grade > 100)
printf("error grade !\n");
/*演示2 阶梯形式演示*/
if (grade >= 0 && grade <50)
{
printf("D\n");
}
else if (grade >= 50 && grade <80)
{
printf("C\n");
}
else if (grade >= 80 && grade <90)
{
printf("B\n");
}
else
{
printf("A\n");
}
/*演示3 嵌套形式演示*/
if (grade >= 50 && grade < 100)
{
if (grade >= 80 && grade <100)
{
if (grade >= 90 && grade <100)
{
printf("A\n");
}
else
printf("B\n");
}
else
{
printf("C\n");
}
}
else
{
printf("D\n");
}
return 0;
}
如上图所示,演示3的代码明显质量要高一点,利用二分查找方式,程序执行效率提高一倍。
1.2 switch-case语句
switch case语法:
switch(表达式) //表达式需要是整型、字符型表达式、枚举(实质就是整型)
{
case 常量表达式1:语句块1;break;
……
default : 语句块n;break; //此处不需要break,因为后面没东西了
}
见如下代码,实现学生成绩简单评级。
#include<stdio.h>
#define ERROR 1
int main(int grgc, char *argv[])
{
float sorce = 0;
puts("please input sorce:\r\n");
scanf("%f",&sorce);
if(sorce > 100 || sorce < 0)
{
printf("bad input!\r\n");
return -ERROR;
}
switch((int)sorce/10) //强转为int 因为switch关键字后面必须是整型或者字符型值
{
case 9 : printf("A\r\n"); break;
case 8 : printf("B\r\n"); break;
case 7 : printf("C\r\n"); break;
case 6 : printf("D\r\n"); break;
default :printf("E\r\n");
}
return 0;
}
如果没有特殊的意图,建议把default放在最后,养成写default的习惯。
二、循环语句
2.1while和do-while
while(i<10){ /*code*/} //代表只要i小于10就执行code部分
do {/*code*/} while(i<10); //代表直到i大于等于10就停止code的循环
例子,求1到100的和,代码如下:
#include<stdio.h>
int main(int grgc, char *argv[])
{
int i = 1,sum = 0;
while(i <= 100) /*只要型*/
{
sum += i;
i++;
}
printf("1+2+3+4+...+100=%d\r\n",sum);
return 0;
}
int main(int grgc, char *argv[])
{
int i = 1,sum = 0;
do
{
sum += i;
i++;
} while (i<=100);
printf("1+2+3+4+...+100=%d\r\n",sum);
return 0;
}
2.2 for
for(表达式1;表达式2;表达式3)
{
步骤;
}
//先执行表达式1.然后执行表达式2,若为真,则执行循环,然后执行表达式3;若为假,执行for循环外的语句
例子,求1到100的和,代码如下:
#include<stdio.h>
int main(int grgc, char *argv[])
{
int sum = 0;
for(int i = 0;i <= 100;i++)
{
sum += i;
}
printf("1+2+3+4+...+100=%d\r\n",sum);
return 0;
}
2.3 goto
goto语句在底层驱动开发很常见,有大量的释放工作和退出工作都是用goto完成。
如当函数有很多个出口,**使用goto把这些出口集中到一处是很方便的,**特别是函数中有许多重复的清理工作的时候。
理由是:
-无条件跳转易于理解
-可以减少嵌套
-可以避免那种忘记更新某一个出口点的问题
-算是帮助编译器做了代码优化
可以给大家看一段代码,参考下goto在底层中的常用性。
if (card->ext_csd.max_packed_writes >= 3 &&
card->ext_csd.max_packed_reads >= 5 &&
host->caps2 & MMC_CAP2_PACKED_CMD) {
err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
EXT_CSD_EXP_EVENTS_CTRL,
EXT_CSD_PACKED_EVENT_EN,
card->ext_csd.generic_cmd6_time);
if (err && err != -EBADMSG)
goto free_card;
if (err) {
pr_warn("%s: Enabling packed event failed\n",
mmc_hostname(card->host));
card->ext_csd.packed_event_en = 0;
err = 0;
} else {
card->ext_csd.packed_event_en = 1;
}
}
if (!oldcard)
host->card = card;
mmc_free_ext_csd(ext_csd);
return 0;
free_card:
if (!oldcard)
mmc_remove_card(card);
上一段代码是我从内核源码出随便摘的一端,可以看到goto一般用于错误的统一跳转。
例子:用goto实现1到100的和,代码如下:
#include<stdio.h>
int main(int grgc, char *argv[])
{
int i = 1,sum = 0;
loop:
if(i <= 100)
{
sum += i;
i++;
goto loop;
}
printf("1+2+3+4+...+100=%d\r\n",sum);
return 0;
}
三、转向语句
3.1 break
break用在从循环内跳出循环体,提前结束一层循环。(break只能用于循环体内或者switch语句中)
用如下代码演示,实现前n个数的和大于2000则跳出循环,并打印最后一个数及加的结果。
#include<stdio.h>
int main(int grgc, char *argv[])
{
int sum = 0;
int i = 0;
for(i = 0;i <= 100;i++)
{
sum += i;
if(sum > 2000)
break;
}
printf("i is %d sum is %d\r\n",i,sum);
return 0;
}
3.2 cpntinue
continue语句用于结束本次循环,接着判定下一次是否执行循环,continue是直接结束本次循环,而break是跳出循环。
比如一个佛如循环需要进行一百次,当使用break时,直接退出该循环,而使用continue只会结束某一次循环。
3.3 return
return (<表达式>)
主要用于终止包含它的函数的执行
若终止的为主函数,则主程序结束,和exit(0)一个作用。
四、综合实例
1、判断2000-2500年中每一年是否为闰年,将闰年次数累计,并将累计结果输出。
提示:闰年的条件为:能被4整除,但不能被100整除的年份;能被100整除,不能被400整除的年份
答:
#include <stdio.h>
int main(int argc, char const *argv[])
{
int year = 2000 , sum = 0;
while (year <= 2500)
{
if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0))
sum++;
year++;
}
printf("total: %d\n", sum);
return 0;
}
2、用for循环打印99乘法表
答:
#include<stdio.h>
int main(int grgc, char *argv[])
{
int sum = 0;
for(int col = 1 ; col <= 9 ; col++)
{
for(int row = 1 ; row <= col ; row++)
{
sum = row*col;
printf("%d*%d=%d\t",row,col,sum);
}
printf("\n");
}
return 0;
}
3、用for循环打印如下图案:
F
_FE
__FED
___FEDC
____FEDCB
_____FEDCBA
答:
#include<stdio.h>
int main(int grgc, char *argv[])
{
char ch = 'F';
printf("please input a char:\r\n");
scanf(" %c",&ch);
for(int i = 0 ; i <= ch - 'A' ; i++)
{
for(int z = 0 ; z < i ; z++)
putchar('_');
for(int j = 0 ; j <= i ; j++)
{
putchar(ch - j);
}
printf("\n");
}
return 0;
}
4、打印出所有的“水仙花”数。所谓“水仙花”数是指一个3位数,其各个位数字立方和等于该数本身。
答:
#include<stdio.h>
#include<math.h>
int main(int grgc, char *argv[])
{
unsigned int a = 0,b = 0,c = 0;
unsigned int number = 100; //水仙花是三位数 在这里初值设置为100
while(number <= 999)
{
a = number/100;
b = (number - (a*100))/10;
c = number%10;
if((pow(a,3) + pow(b,3) + pow(c,3)) == number)
{
printf("%d^3+%d^3+%d^3 = %d\r\n",a,b,c,number);
}
number++;
}
return 0;
}
编译时需要链接动态库:gcc -Wall xxx.c -o xxx -lm
5、已知三个数,a,b,c,找出最大值放入max中
ps:欢迎大佬指正,共同学习进步。