(本人新手小白,欢迎指正)
在C语言中,结构可以分为三种,分别是:循环结构、选择结构、顺序结构。
顺序结构:
循环结构:while、for、do-while
选择结构:if-else、swich
1.0顺序结构
即自上而下按进行。
代码语言:javascript复制#include <stdio.h>
int main()
{
printf("1");
printf("2");
printf("3");
printf("4");
printf("5");
return 0;
}
2.0循环结构
2.1while
我们先来看看while的语法
代码语言:javascript复制while(表达式)
{
循环体
}
2.1.1实践:在屏幕上打印1~10的数
代码语言:javascript复制#include<stdio.h>//main的头文件
int main()//主函数
{
int m = 1;//初始化变量
while(m)
{
printf("%d ",m);
m ;
}
return 0;
}
此时就会打印1~10的数字,这就是while循环的简单应用了。
首先在循环外初始变量,然后
2.2 for
for循环在三种循环中最常见,也是应用较为多的一种。
代码语言:javascript复制for(表达式1;表达式2;表达式3)
{
循环体
}
表达式1 用于循环变量的初始化
表达式2 用于循环条件结束的判断
表达式3 用于循环变量的调整
2.2.1实践:在屏幕上打印1~10的值
代码语言:javascript复制#include <stdio.h>
int main()
{
int i = 0;
for(i = 1; i <= 10; i )
{
printf("%d ",i)
}
return 0;
}
2.3 do-while
代码语言:javascript复制do
{
循环体
}while(表达式)
while 和 for 这两种循环都是先判断,条件如果满⾜就进⼊循环,执⾏循环语句,如果不满⾜就跳 出循环; ⽽ d o while 循环则是先直接进⼊循环体,执⾏循环语句,然后再执⾏ 达式为真,就会进⾏下⼀次,表达式为假,则不再继续循环。
2.3.1实践:在屏幕上打印1~10的值
代码语言:javascript复制#include <stdio.h>
int main()
{
int i = 1;
do
{
printf("%d ", i);
i = i 1;
}while(i<=10);
return 0;
}
2.4 while和for的比较
while和for都有初始化、判断、调整这三个部分,但是for循环的三部分非常集中,便于代码的维护,而如果代码比较多的时候while的三部分比较松散,所以从形式上for循环要更优一些。
2.5 break和continue语句
在循环执⾏的过程中,如果某些状况发⽣的时候,需要提前终⽌循环,这是⾮常常⻅的现象。C语⾔中 提供了 continue 两个关键字,就是应该到循环中的
- break 的作⽤是⽤于永久的终⽌循环,只要 break 被执⾏,直接就会跳出循环,继续往后执 ⾏。
- co ntinue 的作⽤是跳过本次循环 差异的。
2.5.1 while循环中的break和continue
2.5.1.1 break举例
代码语言:javascript复制#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
break;//当i等于5后,就执行break,循环就终止了
printf("%d ", i);
i = i 1;
}
return 0;
}
执行结果
打印1 2 3 4 后遇到5,满足i=5时,break执行,跳出循环,不再执行。
break的作用就是永久的终止循环,只要brake执行,break外的第一层循环就不会被执行,以后若想在某种条件下终止循环,则可以使用break来完成,达到我们想要的效果。
2.5.1.2 continue举例
我们把上面break换成continue看看结果会是什么?
代码语言:javascript复制#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
continue;//当i等于5后,就执行continue,5的循环就被跳过了。
//但i=i 1也被跳过,所以这里进入死循环。
printf("%d ", i);
i = i 1;
}
return 0;
}
到这里,不难发现,continue的作用,就是跳过continue后的代码,但若把循环的调整放在continue则会进入死循环。
2.5.2 for循环中的break和continue
for循环和while循环中的break是一样的,都是跳出循环,不管后面还有多少次循环。
2.5.2.1 break举例
代码语言:javascript复制#include <stdio.h>
int main()
{
int i = 1;
for (i = 1; i <= 10; i )
{
if (i == 5)
break;
printf("%d", i);
}
return 0;
}
运行结果
2.5.2.2 continue举例
将上面代码的break换成continue会是什么结果?上代码。
代码语言:javascript复制#include <stdio.h>
int main()
{
int i = 1;
for (i = 1; i <= 10; i )
{
if (i == 5)
continue;
printf("%d ", i);
}
return 0;
}
运行结果
所以在 for 循环中 continue 的作⽤是跳过本次循环中 continue 后的代码,直接去到循环的调 整部分。未来当某个条件发⽣的时候,本次循环⽆需再执⾏后续某些操作的时候,就可以使⽤ continue 来实现。
2.5.3 do-while中的break和continue
do-while中的情况几乎和while的情况一模一样,在次不做过多演示。
3.0选择结构
3.1 if-else
3.1.1if
if的语法形式如下
代码语言:javascript复制if (表达式)
{
语句
}
若表达式成立(为真),则执行语句;表达式不成立(为假),则语句不执行。
在C语⾔中,0为假,⾮0表⽰真,也就是表达式的结果如果是0,则语句不执⾏,表达式的结果如果是 不是0,则语句执⾏。
3.1.1.1 if示例
代码语言:javascript复制#include <stdio.h>
int main()
{
int m = 10;
if (m % 2 == 0)
printf("偶数");
return 0;
}
3.2 else
一个数不是偶数就是奇数,当不是偶数时就需要用到else。即if......else......
其语法形式如下:
代码语言:javascript复制if (表达式)
{
语句1
}
else
{
语句2
}
3.1.2.1 else示例
如果一个数不是偶数,那么怎么用代码实现效果。
代码语言:javascript复制#include <stdio.h>
int main()
{
int m = 9;
if (m % 2 == 0)
printf("偶数");
else
printf("奇数");
return 0;
}
3.1.3 分⽀中包含多条语句
if和else只能控制一条语句,比如:
代码语言:javascript复制#include <stdio.h>
int main()
{
int m = 0;
scanf("%d",&m);
if ( m >= 18)
printf("已成年");
printf("可以谈恋爱");
return 0;
}
不管是>=18 还是⼩于18,大屏幕上都会打印可以谈恋爱。
若想让if与 printf("可以谈恋爱");关联起来,则需要加个大括号,如下:
代码语言:javascript复制#include <stdio.h>
int main()
{
int m = 0;
scanf("%d", &m);
if (m >= 18)//if 后使⽤{} 控制多条语句这个块也叫:程序块,或者复合语句
{
printf("已成年");
printf("可以谈恋爱");
}
return 0;
}
这样当m<18时,则不会打印任何东西。
3.嵌套if
在if-else中,else 可以与另⼀个 if 语句连⽤,构成多重判断。
⽐如:要求输⼊⼀个整数,判断输⼊的整数是0,还是正数或者负数。请看如下代码:
代码语言:javascript复制#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if (num == 0)
printf("输入的数为0");
else if (num < 0)
printf("输入的数为负数");
else
printf("输入的数为正数");
return 0;
}
从第二个if到printf("输入的数为正数");结束都是嵌套的if,这样我们便可以实现更为复杂的逻辑。
下面用练习来巩固一下:
代码语言:javascript复制输⼊⼀个⼈的年龄 如果年龄 <18 岁,打印 " 少年 " 如果年龄在 18 岁⾄ 44 岁打印 " ⻘年 " 如果年龄在 45 岁⾄ 59 岁打印 " 中⽼年 " 如果年龄在 60 岁⾄ 89 岁打印 " ⽼年 " 如果 90 岁以上打印 " ⽼寿星 "
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if (age < 18)
printf("少年n");
else if (age <= 44)
printf("⻘年n");
else if (age <= 59)
printf("中⽼年n");
else if (age <= 90)
printf("⽼年n");
else
printf("⽼寿星n");
return 0;
}
带上大括号,更清晰
代码语言:javascript复制#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if (num < 18)
printf("少年");
else
{
if (num < 44)
printf("青年");
else
{
if(num < 59)
printf("中老年");
else
{
if (num < 89)
printf("老年");
else
printf("老寿星");
}
}
}
return 0;
}
3.2 switch
除了 if 语句外,C语⾔还提供了 switch 语句来实现分⽀结构。 switch 语句是⼀种特殊形式的 的 el if...else 结构,⽤于判断条件有多个结果的情况。它把多重 se if 改成更易⽤、可读性更好的形式。
代码语言:javascript复制switch (expression) {
case value1: statement
case value2: statement
default: statement
}
上面代码中,根据表达式不同的值,执行相应的case分支。如果找不到对应的值,就执行default。
注意:
switc后面的表达式必须为整形表达式。
case后的值,也必须为整形常量。
3.2.1 if语句和Switch语句的对比
练习:输入任意一个整数值,计算除3后的余数
用if语句完成的效果,如下:
代码语言:javascript复制#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
if (n % 3 == 0)
printf("整除,余数为0n");
else if (n % 3 == 1)
printf("余数是1n");
else
return 0;
}
如果改用Switch语句,可以这样写:
代码语言:javascript复制#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
switch (n % 3)
{
case 0:
printf("整除,余数为0n");
break;
case 1:
printf("余数是1n");
break;
case 2:
printf("余数是2n");
break;
}
return 0;
}
上述的代码中,我们要注意的点:
case和后面的数字间必须要有空格。
3.2.2 switch语句中的break
前面的代码中,如果我们去掉break,会出现什么情况呢?
代码语言:javascript复制#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
switch (n % 3)
{
case 0:
printf("整除,余数为0n");
case 1:
printf("余数是1n");
case 2:
printf("余数是2n");
}
return 0;
}
我们发现7除以3余数是1,但还打印了余数是2,这是为什么?
原因是:其除7除以3余数是1,但执行完后没遇到break,让其跳出来,则会继续打印,case的其他语句,直达遇到break或是switch执行完。
就比如上面的代码就后执行了case2中的语句。
所以在switch中break语句是非常非常重要的,能体现真正的分支效果。当然,也不是所有的case都要加break,具体看下来例子:
练习
输⼊⼀个1~7的数字,打印对应的星期⼏ 例如: 输⼊:1 输出:星期⼀ 输⼊:2 输出:星期⼆ 输⼊:3 输出:星期三 输⼊:4 输出:星期四 输⼊:5 输出:星期五 输⼊:6 输出:星期六 输⼊:7 输出:星期天
代码实现:
代码语言:javascript复制#include <stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
printf("星期一n");
break;
case 2:
printf("星期二n");
break;
case 3:
printf("星期三n");
break;
case 4:
printf("星期四n");
break;
case 5:
printf("星期五n");
break;
case 6:
printf("星期六n");
break;
case 7:
printf("星期日n");
break;
}
return 0;
}
代码语言:javascript复制如果需求发⽣变化,变为: 1.输⼊1-5,输出的是“⼯作⽇”; 2.输⼊6-7,输出“休息⽇”
#include <stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日n");
break;
case 6:
case 7:
printf("休息日n");
break;
}
return 0;
}
根据上面的练习,我们知道了应该根据实际需求来判断switch的书写。
3.2.3 switch语句中的default
在上述代码中,如果输入的值不是1~7,那则不会进行打印,为了解决这一情况,这就需要用到default;
代码语言:javascript复制#include <stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日n");
break;
case 6:
case 7:
printf("休息日n");
break;
default:
printf("输入错误,请重新输入");
}
return 0;
}
3.2.4 switch中default和case的顺序问题
其实在switch中不管是case在钱,还是default在后,这都是可以的,甚至可以将default放在中间,这都是没有毛病的。
4.0 特殊语句goto
C语⾔提供了⼀种⾮常特别的语法,就是goto语句和跳转标号,goto语句可以实现同一个函数内跳转到设置好的标号处。
例如:
代码语言:javascript复制#include<stdio.h>
int main()
{
printf("hehen");
goto next;
printf("hahan");
next:
printf("跳过haha的打印n");
return 0;
}
运行结果
goto语句如果使用不当·,就会导致在函数内部随意乱跳转个,打乱程序的执行流程,所以我们的建议是能不用尽量不去用;但goto语句也不是⼀⽆是处,在多层循环的代码中,如果想快速跳出使用goto就方便了。