#小结总结#
1.if语句
if语句的语法形式是if(表达式)——表达式成立(为真),则语句执行,表达式不成立(为假的),则语句不执行。
在C语言中,0为假,非0为真,也就是表达式的结果如果是0,则语句不执行,如果结果不是0,则语句执行。
使用代码举例:一个用if语句判断是否是奇数的代码,那么如果不是奇数的话他肯定就是偶数,那么就需要用到else了。
#include<stdio.h>
int main()
{
int num=0;
scanf("%d",&num);
if(num%2==1) //输入一个数如果除以2的余数为1的时候那么这个数就是奇数
printf("%d",num);
return 0;
}
else:
else的作用就是判断一个条件如果第一个不成立的话那么其他的就进入else判断。
举例如下:
#include<stdio.h>
int main()
{
int num=0;
scanf("%d",&num);
if(num%2==1)
printf(“%d",num); //如果是奇数则打印这个
else
printf("%d",num); //如果是偶数则打印这个
return 0;
}
嵌套if:
在if else 语句中,else可以与另一个if语句连用,构成多重判断.
代码举例:判断一个条件多种情况就可以用到else if 并且else if不止可以写一条,可以写多条。
#include<stdio.h>
int main()
{
int num=0;
scanf("%d ",&num);
if(num==0)
printf("输入的数字是0\n");
else if (num>0)
printf("输入的是正数\n");
else
printf("输入的是负数");
return 0;
}
并且判断语句里面也可以判断,就叫嵌套。
代码举例:输入一个整数,如果他是正数,在判断它是奇数还是偶数,并输出;如果不是正整数则输出:非正数。
#include<stdio.h>
int main
{
int num = 0;
scanf("%d ", &num );
if(num > 0)
{
if(num%2 == 0)
printf( "是偶数\n" );
else
printf(" 是奇数\n ");
}
else
printf(" 非正数\n ");
return 0;
}
悬空else问题:
如果有多个if和else,可以记住这样一条规则,else总是跟最近的if匹配。
代码举例:这段代码是什么都不输出的。
原因:因为else总跟最接近的if匹配。因为eles是跟第二个if匹配的,所以就是if
里面嵌套了一个if....else,所以当第一个if的条件不成立的时候,将不会进入条件,所以这段代码什么都不打印。
#include<stdio.h>
int main()
{
int a = 0;
int b = 2;
if(a == 1)
if(b == 2)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
但是如果你希望else确实跟第一个if匹配的话,可以这样写:
#include<stdio.h>
int main()
{
int a = 0;
int b = 2;
if(a == 1)
{ if(b == 2)
} printf("hehe\n");
else
{
printf("haha\n");
}
return 0;
}
2.关系操作符
C语言中用于比较的表达式,称为关系表达式,里面使用的运算符就称为关系运算符。
· > ——大于运算符 举例:a>b
· <——小于运算符 举例:a<b
· >=——大于等于运算符 举例:a>=b
· <=——小于等于运算符 举例:a<=b
· ==相等运算符 举例:a==b
· !=——不相等运算符 举例:a!=b
关系表达式通常返回0或1,表示真假。
C语言中,0表示假,所有非零表示真。比如,20>12返回1,12>20返回0。
注意:多个关系运算符不宜连用,举例:a>b>c
谨记:关系运算符是从左到右计算。举例:(a<b)<c 如果a<b不成立为假就是0 那么0<c 反之一样。
3.条件操作符
条件操作符也叫三目操作符,需要接收三个操作数的,形式如:exp?exp2:exp3 。
条件操作符的计算逻辑是:如果exp1为真,exp2计算,计算结果是整个表达式的结果;如果exp1为假,进行exp3计算,计算结果是整个表达式的结果。
4.逻辑操作符
&& :与运算符,并且的意思(两侧的表达式都为真,则为真,有一个假的就全是假的)
举例:
#include<stdio.h>
int main()
{
int month=0;
scanf("%d ",&month);
if(month>=3 && month<5)//如果满足在三月到五月那么就是春季
printf("春季\n")
return 0;
}
|| :异或,或者的意思(两侧至少有一个表达式为真,那么整个表达式就是真的。
举例:
#include<stdio.h>
int main()
{
int month=0;
scanf("%d",&month);
if(month==12||month==1||month==2)//一年中十二月或者一月或者2月是冬天 只要一个满足那么就是冬季
printf("冬季\n");
return 0;}
! :逻辑取反操作符(改变单个表达式的真假)
举例:
#include<stdio.h>
int main
{
int flag=0;//0为假 说明flag为假
if(!flag) //!flag和flag相反 那么就是真 进入循环
{
printf("hehe\n")
}
return 0;
}
注意:C语言逻辑运算符还有一个特点,他总是对左侧的表达式求值,再对右边的表达式求值,这个顺序是保证的。但是如果左边的表达似乎满足逻辑运算符的条件,就不再对右边的表达式求值,这种情况称为短路。
但是根据左值可以知道整个表达式结果,不再对右操作数进行计算的运算称为短路求值。
举例:
if(month>=3 && month<=5)
//表达式中&&的做操作数是month>=3,右操作数是month<=5,当左操作数month>=3结果是0的时候,即使不判断month<=5,整个表达式结果也是0(不是春季)。
if(month==12 || month==1 || month==2)
//如果month==12,则不用再判断month是否等于1或者2,整个表达式的结果也也是1(是冬季)
//这种仅仅根据左操作数的结果就能知道整个表达式的结果,不再对右操作数进行计算的运算称为(短路求值)。
5.switch语句
switch 与 case密不可分。
用法注意:case和后面的数字之间必须有一个空格。 每个case语句代码执行完之后需要加上break,才可以跳出switch语句。
原因是switch语句是存在分支效果的,只有在switch语句中使用break才可以跳出switch语句,如果某个case语句后面没有break语句,代码会继续执行下去,如果下面还有语句的话则会把下面的语句全部执行。
所以再switch中break语句是非常重要的,能够真正的实现分支效果。
代码举例:
输入任意一个整数值,计算除3后的余数
#include<stdio.h>
int main()
{
int n=0;
scanf("%d",&n);//输入一个整数
switch(n%3)//判断一个整数取余之后的得数 假如是1 那么就跳入case 1中,之后break跳出循环。
{
case 0:
printf("整除,余数为0\n");
break; //跳出循环
case 1:
printf("余数为%1\n");
break; //跳出循环
case 2:
printf("余数为2\n");
break; //跳出循环
}return 0;
}
当然break也不是每个case语句都得有,这需要根据实际的情况来看,举例:
#include<stdio.h>
int main()
{
int day=0;
scanf("%d ",&day);
switch(day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
prinf("工作日\n") // 1 2 3 4 5属于工作日 那么就不需要每个都打印出来加break了
break;
case 6:
case 7:
printf("休息日\n")//和上面逻辑一样
break;
}return 0;
}
那1 2 3 4 5 是工作日 6 7是休息日 那我输入 8 怎么办 ,这个时候就需要用到default了,举例:
#include<stdio.h>
int main()
{
int day=0;
scanf("%d ",&day);
switch(day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
prinf("工作日\n") // 1 2 3 4 5属于工作日 那么就不需要每个都打印出来加break了
break;
case 6:
case 7:
printf("休息日\n")//和上面逻辑一样
break;
default://输入的不是1 ~ 7 的数字,那么走这个程序
printf("输入错误\n");
break;
}return 0;
}
注意:再switch中case子句和default子句没有顺序要求,只要顺序可以满足实际需求就可以,不过通常都是吧default子句放在最后处理的。
6.while循环
while的语句语法结构和if的语句非常相似,例如:
if(表达式)
语句;
while(表达式)
语句;
while语句执行流程:首先上来就是执行判断表达式,表达式的值为0,循环直接结束;表达式的值不为0,则执行循环语句,语句执行完之后在继续判断,是否进行下一次判断。
解析:首先执行表达式1初始化循环变量,接下来执行表达式2的判断部分,表达式2的结果如果==0,则循环结束;表达式2的结果如果!=0则执行循环语句,循环语句执行完之后,再去执行表达式3,调整循环变量,然后再去表达式2的地方执行判断,表达式2的结果是否为0,决定循环是否继续。
整个循环的过程中,表达式1初始化部分只被执行1次僧下的就是表达式2,循环语句,表达式3在循环。
代码举例:打印1-100的数字
while循环在屏幕上打印1-100的数字
#include<stdio.h>
int main
{
itn i=1; //从1开始
while(i<=100) //1<100条件成立进入循环(当i>=100时循环停止)
{
printf("%d ",i); //打印i的值
i++; //i++ 之后等于2 一直循环到i>=100
}
return 0;
}
7.for循环
for循环时三种循环使用最多的,for循环的语法形式如下:
for(表达式1;表达式2;表达式3)
语句;
表达式1:用于循环变量初始化
表达式2:用于循环结束条件的判断
表达式3:用于循环变量的调整
for循环的执行流程:首先执行表达式1初始化循环变量,接下来就是执行表达式2的判断部分,表达式2的结果如果==0,则循环结束;表达式2的结果如果!=0则执行循环语句,循环语句执行完后,再去执行表达式3,调整循环变量,然后再去表达式2的地方执行判断,表达式2的结果是否为0,决定循环是否继续。
整个循环过程中,表达式1初始化部分只被执行1次,剩下的就是表达式2,循环语句,表达式3在循环。
for循环代码示例:打印1-10的数字:
#include<stdio.h>
int main()
{
int i=0;
for(i=1;i<=10;i++)
printf("%d ",i);
return 0;
}
8.do-while循环
在循环中do while循环使用最少,语法如:
do
语句;
while(表达式);
while和for循环都是先判断,条件满足的情况下才会进入循环,执行循环语句,如果不满足就退出循环。
而do while 循环则是先进入循环体,执行循环语句,然后再执行while后的判断表达式,表达式为真,就会进行下一次,表达式为假,则不再继续循环。
do while循环的执行流程:在do while循环中先执行图上的“语句”,执行完语句,再去执行“判断表达式”,判断摆到是结果!=0,则循环继续,执行循环语句;判断表达式结果如果==0,则循环结束。
所以在do while语句中循环体是至少执行一次的,这是do while循环比较特殊的地方。
代码示例:使用do while打印1-10的数字:
#include<stdio.h>
int main()
{
int i=1;
do
{
printf("%d ",i);
i++;
}while(i<=10)
return 0;
}
9.break和continue
break ——
其实和while循环中的break一样,for循环中的break也是用于终止循环到,不管循环还需要多少次,只要执行到了break,循环就彻底终止。
例如代码: break的作用的永久终止循环,未来我们在某个条件发生的时候,不想继续循环的时候就可以用break来执行终止。
#include<stdio.h>
int main()
{
int i=1;
for(i=1;i<=10;i++)
{
if(i==5)
break;
printf(“%d ”,i);
}return 0;
}
运行结果为:1 2 3 4
continue ——
在for循环中contiue的作用是跳过本次循环中continue后的代码,直接去循环的调整部分。未来当某个条件发生的时候,本次循环无需再执行后续某些操作的时候,就可以使用continue来实现。
代码示例:
#include<stdio.h>
int main()
{
for(int i=1;i<=10;i++)
{
if(i==5)
contnue;
printf("%d ",i);
}return 0;
}
注: do while中的break和continue和while中几乎一模一样.
10.语句的嵌套
前面讲了三种循环while,do while,for,这三种循环往往会嵌套在一起才能更好的解决问题,就是我们所说的循环嵌套。
代码示例:这是一个要从100~200之间找出素数的代码,使用了嵌套。
#include<stdio.h>
int main()
{
int i=0;
for(i=100;i<=200;i++)//找到100-200之间的数字
{
int j=0;
int flag=1;//假设素数是i
for(j=2;j<i;j++)//使用除了1和自身之外的数字试着除
{
if(i%j==0)//如果被整除 证明不是素数
{
flag=0 ;//等于0就不是素数
break;//跳出循环
}
}
if(flag==1)//等于1就是素数
printf("%d ",i);
}
return 0;
}
11.goto语句
C语言提供了一种非常特别的语法,就是goto语句和跳转标号,goto语句可以实现在同一个函数内跳转到设置好的标号处。
代码示例:使用goto语句和跳转标号实现了跳过语句。
#include<stdio.h>
int main()
{
printf("hehe\n");
goto next:
printf(“haha\n”);
next:
printf("跳过了haha的打印\n");
return0;
}
注意:goto语句如果使用不当,就会导致在函数内部随意跳转,打乱程序的执行流程,所以我们的建议是能不用尽量不去使用;但是goto语句也不是一无是处,在多层循环的代码中,如果想要快速跳出,使用goto语句就非常方便。
示例:
for(...)
{
for(...)
{
for(...)
{
for(disaster)
goto error;
}
}error:
//。。。。。。
}
本来for循环想提前退出需要使用break,但是一个break不足以全部退出,所以在这种情况下我们使用goto语句就会更加快捷。
12.利用分支循环做小项目
举例:一个通过分支循环写的猜数字强制关机的小游戏。
//void game()
//{
// int input = 0;
// int ret = rand() % 100 + 1;
// printf("请输入您的数字:>\n");
// int count = 5; // 错误次数计数器
// while (count > 0)
// {
// scanf("%d", &input);
// if (input < ret)
// {
// printf("猜小了,还有%d次机会\n", count - 1);
// }
// else if (input > ret)
// {
// printf("猜大了,还有%d次机会\n", count - 1);
// }
// else
// {
// printf("猜对了,答案为:%d\n", ret);
// break;
// }
// count--;
// if (count == 0)
// {
// printf("五次输入错误,程序强制关闭。\n");
// system("shutdown /s /t 0");
// }
// }
//}
//
//void menu()
//{
// printf("*************************\n");
// printf("********* 1.play ********\n");
// printf("********* 0.gun ********\n");
// printf("*************************\n");
//}
//
//int main()
//{
// int input = 0;
// srand((unsigned int)time(NULL));
// do
// {
// menu();
// printf("请选择:>");
// scanf("%d", &input);
// switch (input)
// {
// case 1:
// game();
// break; // 添加break语句以退出switch语句
// case 0:
// printf("退出游戏\n");
// break;
// default:
// printf("输入错误,重新输入\n");
// break; // 添加break语句以退出switch语句
// }
// } while (input != 0); // 修改退出条件为输入0
// return 0;
//}