——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
第一章 循环结构
循环结构是指在一定的条件下重复执行某一个代码段。构成循环结构的三大因素:循环条件、循环体和让循环为假的控制条件。循环条件是让循环得以有意义的条件;循环体是在某一条件下执行的代码,如果没有代码段那么循环体的循环将没有任何意义;让循环为假的控制条件是让循环不是死循环,若循环是死循环,那么循环将永不停止,没有意义。
循环结构分为for循环,while循环,do…while循环三种。
1、while循环讲解(又称为当循循环)
1)while循环的格式:
while(表达式){
语句块
}
2)while循环的一个示例
int main(int argc, const char * argv[]) {
int i=1,sum=0;
int n=0;
printf("请输入一个数:\n");
scanf("%d",&n);
//计算1+2+3...+n的循环while结构
//i<=n为循环条件,当i>n时就跳出循环,结束循环结构。
while (i<=n) {
sum+=i;
i++;
}
printf("1+2+3+...+%d=%d",n,sum);
return 0;
}
3)while使用注意
(1)若while后面只有一句话可以省略大括号,如。
int i=0;
int sum = 0;
while(i++<100)
//省略了大括号
sum=sum+i;
(2)死循环分为两种:判断条件一直为真即任何数值都有真假性;空语句的问题。
//最简单的死循环
while(1)
//空语句问题造成的死循环,
while(i<3);//虽然控制条件不会造成空语句问题,分号导致了空语句,进而导致死循环。
(3)当一个变量和一个常量==和!=运算时,一般把变量放在前面
while(i!=5){
printf("succeed");
i++;
}
(4)作用域:内部代码块定义的变量不能在外部访问
(5)作用域紊乱问题:
while(5>4)
int = 5;//这是错误的,虽然说咋一看没什么问题,在不使用大括号时不能定义变量。
2、do…while循环结构(又称为直到型循环)
1)do…while的语法格式:
do{
循环体
}while(条件);
注意:在do…while结尾需要有分号。
#include <stdio.h>
int main(int argc, const char * argv[]) {
int i = 0;
int sum = 0;
//计算1+2+3+...+100的和
do {
sum +=i;
i++;
} while (i<=100);
return 0;
}
2)while和do…while的区别
关于do…while(先执行再判断)和while(先判断在执行)的区别
1)当循环控制条件第一次判断不为假的时候
while和do…while执行次数相同。
2)当循环控制条件第一次判断为假的时候
while一次都不执行,do…while会执行一次。
3、for循环
1) for循环的格式:
//初始化语句只会被执行依次
for(1、初始化语句;2、变量的控制条件;3、变量值的表达式)
{
4、语句块
}
执行过程是:1->2->4->3->2->4->3依次循环
2)for循环的几种表达式结构
#include <stdio.h>
int main(int argc, const char * argv[]) {
//1.基本格式
for (int i=0; i<5; i++) {
printf("%d\t",i);
}
//2.省略格式:省略表达式1,省略表达式3
int i=0;
for (; i<5; ) {
printf("%d\t",i);
i++;
}
//3.全省
int i=0;
for (; ; ) {
if (i<5) {
printf("%d\t",i);
i++;
}else{
break;//break后的语句将不再执行,将跳出当前循环
}
}
//4.什么都不写,是一个死循环。
int i=0;
for (; ; ) {
printf("hello world\n");
}
return 0;
}
第二章 分支结构
分支结构用于判断给定的条件,根据判断的结果判断某些条件,根据判断的结果来控制程序的流程。分支结构可以理解为选择结构,即根据选择的条件进行流程。
分支结构主要分为if…else和switch结构
1、if..else结构
1)if..else的格式:
if(表达式/常量/变量){
语句块1
}else{
语句块2
}
执行的原理分两步:一先计算if后先括号的值,有两个值:真(1)、假(0);二如果为真(1)执行语句块1,如果为假(0)执行语句块2。
2)if语句的嵌套
if(表达式1){
语句块1//若表达式1的值为真执行此语句
}else{
//若表达式1的值为假执行此代码块
if(表达式2){
语句块2//若表达式2的值为真执行此语句
}else{
语句块3//若表达式2的值为假执行此语句
}
}
3)if语句的使用注意
//1、空语句
if (1!=3); //空语句,什么都没有干
//2、如果if之后的代码块,如果只有一句话,则可以省略大括号
if (5>3)
printf("5>3\n"); //if条件如果没有大括号,只会影响一句话
//3、永真式和永假式
if(1){ } //大括号中永远执行
if(0){ } //大括号中永远不会执行
//4、if语句结合return 语句
if (5>3)
return 0; //在一个函数中,return语句之后的语句都不会执行
//5、if作用域的问题
if (3==3) {
int num = 10;
}
printf("num = %d\n",num);//代码块外部不能访问定义的内部变量
//6、作用域的紊乱
if(a==3)
int num = 10;//语句后不能直接在没加大括号的情况下定义变量,这是错误的。
2、switch分支结构
1)switch的基本格式
switch(表达式){
case 常量表达式1: 语句1;
case 常量表达式2: 语句2;
case 常量表达式3: 语句3;
case 常量表达式4: 语句4;
case 常量表达式5: 语句5;
case 常量表达式6: 语句6;
default:
break;
}
//将表达式的值分别与常量表达式作对比,等于谁就将执行那一段语句
2)case语句的穿透问题
case穿透指的是某个case语句执行完成后,并没有结束,而直接向下执行其他的case语句。
那程序中要如何防止穿透问题呢?
我们需要在每一个case语句结束之后,加上一句话:break; break作用 是结束switch语句。
int sum=1
//不加break,程序运行后sum=64
//加了break,程序运行后sum=2
switch(1){
case 1: sum+=sum;break;
case 2: sum+=sum;break;
case 3: sum+=sum;break;
case 4: sum+=sum;break;
case 5: sum+=sum;break;
case 6: sum+=sum;break;
default:
break;
}
3)switch使用注意
//1、switch语句的表达式类型
//1)可以放一个整型的变量 int num = 10;switch (num)
//2)可以放一个整形常量 switch (10)
//3)可以放一个返回值是整型的表达式
switch (1+1),switch(num = 1+1)
//4)还可以放可以转换为int类型的表达式 switch ('b'+'B')
// 2、casey语句使用注意
//1)case语句可以有多行语句,可以加括号,也可以省略括号
case 10:
printf("lala\n");
printf("lala\n");
//2) case语句格式: case 常量表达式: (空格和冒号不能省)
//3) 可以是常量 case 10:
//4) 如果放表达式,那么只可以是常量表达式 case 2+2:
//5) case 后面不能是实数 case 9.0f 错误的
//6) case 语句之后,默认的第一句话不能定义定义变量
//如果第一句话非要定义,应该加上大括号
case 10:{
int num2 = 3;}
//7) 编译器的bug
int num = 11;
switch (num) {
case 10:
printf("num = %d\n",num);
int num2 = 3;//这样定义是可以的
break;
case 11:printf("num2 = %d\n",num2);
break;//使用case1中定义num2,但是程序是可以运行
//但是输出的值并不是num2=10,而是0
//这就是编译器的bug
}
//3、break语句是可选的,可以加也可以不加
//4、default使用注意
//1)default语句的位置可以任意放
//2) case的穿透问题,同样适用于default
//3) 如果default语句放到 switch语句的最后,可以不加break
//如果不是放到最后,是必须加上break的