分支和循环-1

目录

if

基本

else

嵌套if

悬空else

关系操作符

逻辑操作符

! 逻辑取反

&& 与运算符

或运算符

短路

switch语句

break和continue语句

while语句

break

continue语句

for语句

break语句 

continue语句

do while语句 

break语句和continue语句

循环的嵌套

练习

goto语句 


c语言是结构化的程序设计语言,结构指的是顺序结构、选择结构、循环结构

if、switch实现分支,for、while、do while实现循环结构

if

基本

if (表达式)//表达式成立则为真,执行语句,不成立为假,则不执行
语句

c语言中,0为假,非0为真

#include <stdio.h>
int main()
{
    int num=0;
    scanf("%d",&num);
    if (num ==1)
        printf("%d 是符合的数字",num);
    return 0;
}
//满足条件输出,不满足条件退出结构,继续运行程序

else

基本格式,用于只有2种情况,且不管什么情况,都会执行其中一条语句

if(表达式)
 语句1
else
语句2

若要判断奇数偶数,可以用else

int num=0;
scanf("%d",&num);
if (num % 2=0)
    printf("%d是偶数",num);
else
   printf("%d是奇数",num);

if和else语句默认只控制一条语句

if age(>=18)
printf("成年了";
printf("可以谈恋爱了";

这里,不管是否满足条件,可以谈恋爱,这句话都会输出

若要控制多条语句,需要用{}将语句括起来,else后也可以加上{},这个区域叫做程序块或复合语句

if (age>=18)
{
语句1
语句2
}
else
{
语句1
语句2
}

嵌套if

else后可以跟if构成else if语句

int c=0;
scanf("%d",&c);
if (c==1)
printf("1");
else if(c=2)
printf("2");
else
printf("其他")

这里,一共会出现3种情况,等于1时,会是输出1,等于2时会输出2,其他不等于不等于2的情况,都会输出其他

else后面的if else,都是嵌套在第一个else里的

另一种写法

int c=0;
scanf("%d",&c);
if (c==1)
printf("1");
else
{
if(c=2)
printf("2");
else
printf("其他")
}

悬空else

若有多个if和else

else则总是跟最接近的if匹配

int a=0;
if (a==1)
 if (b==2)
    printf("1");
else
printf("111";
//最终结果是都不输出,因为else是跟着上面的if
//如果a不等于1,那后面嵌套的if else,全都不会执行
//可以这么写
int a=0;
if (a==1)
{
if (b==2)
printf("1");
}
else
printf("111");

关系操作符

c语言中用于比较的表达式,称为关系表达式,用的操作符叫做关系运算符

> 小于

< 大于

>= 大于等于

<= 小于等于

== 等于

!= 不等于

a>b
a<b
a>=b
a<=b
a==b
a!=b

关系表达式会返回0或1,表示假真

常用于if或while语句

赋值跟关系是不一样的,建议相等时,常量放左边,变量放右边

x=3//这个表达式会返回值就是3,所以若放在if、while语句中,可能出现意外
3=x//放在if表达式里,会判断错误

可以连续使用关系运算符,但不建议用。

i<k<j//由于从左到右,所以实际是(j<k)<k

若要判断是否介于中间

i<j && j <k

逻辑操作符

! 逻辑取反

&& 与运算符,两边都为真,则为真,否则为假

|| 或运算符,两边有至少1个真,就为真,否则就为假

! 逻辑取反

flag=0;
//iflag就是非0,即为真
if (!flag)
printf("1");
//最后还是会执行语句,输出1

&& 与运算符

双目操作符

j=5 && k=5;
//这个表达式的返回值
//如果j和k都是5,都为真,整体返回值才会是真
//一旦有一个不是真,那返回值就是假,两个都不是真,也是假

若要说一段时间

1<c && c<7;
//最后,c是大于1,小于7的

或运算符

j=5 || k=5;
//若j和k都是5,两边都是真,整体返回值也是真
//若J和k其中一个是5,则其中一边为真,整体返回值也是真
//若j和k都不是5,则两边都是假,整体返回值就是假

短路

对于逻辑运算符而言,总是先对左边的表达式求值,然后再对右边求值。

year=0;
year==1 && month==2;
//由于year==0,所以,左边的表达式结果是0,整个表达式的结果就会是0。
//不对右边的表达式进行判断
//或运算也是如此,如果左边的表达式为真,那整个表达式就是真
//同样不对右边表达式进行求值

因此,仅仅根据左表达式的结果就能知道整个表达式的结果,不再对右边表达式进行计算的运算,称为短路。

switch语句

switch语句是一种特殊的if .....else结构,用于判断条件有多个结果的情况。

switch (表达式,可以为为整型、字符型、枚举型)
{
    case 值1(表达式):语句
    case 值2:语句//case与后面的数字必须有一个空格
    default:语句//如果所有case情况都不满足,就执行default的语句
}
//当满足case的某个条件并执行了相应的语句后或执行了fdefault语句之后
//需要用break语句来结束判断,否则会继续执行当前case语句之后的case语句


//若case的常量值是一个范围,可以选择去掉break来让某一范围的case判断都为一个结果
//default与case的语句没有强制要求,但通常放最后

break和continue语句

break用于提前终止循环

continue用于跳过本次循坏中continue后面的代码,继续下一次循坏

for、while、do while语句中都有break和connitue语句,而continue语句在for和while语句中有些差异

while语句

while(表达式)
{    
    语句1;
    语句2;
}
//while语句的表达式判断,是只要满足条件,会一直执行,也就是会循坏
//直到不满足表达式的值之后,才会结束循坏

break

       

while(i<=10)
{
    if(i==5)
        break;
    printf("%d",i);
    i++;
}
printf("循坏终止之后");
//当循环变量达到5时,会执行break语句,从而终止当前break语句外的第一层循坏
//继续执行下面的输出语句

continue语句

char b;
while (i<=10)
{
    printf("%d",i);
    i++;
    if (i==5)
        continue;
    scanf("%c",&b)
}
//当i==5时,会执行continue语句,从而跳过后面的scanf语句
//直接进行循环条件的判断
//但如果循环变量语句的增长,放在continue语句后面
//会造成死循环

for语句

for(表达式1;表达式2;表达式3)
{
    语句1;
    语句2;
}
//表达式1是用于循环变量的初始化
//表达式2是用于循环结束条件的判断
//表达式3用于循环变量的调整
第一次执行循坏,会先进行表达式1的初始化循坏变量,之后的循坏不会执行表达式1
执行了表达式1后,会进行表达式2的判断,若满足条件,执行语句。之后再进行表达式3的语句,从而调整循环变量。这是一次循坏,接下来,继续进行表达式2的判断,满足继续执行语句,不满足则退出循坏

break语句 

与while语句的break语句作用用法相同

continue语句

由于for循坏的循坏变量调整是在for后面写的,所以continue语句在for循坏中不会造成死循环

do while语句 

do
    语句;
while(表达式);
//while和for循坏都是先判断,满足条件再进入循环,执行循环语句,如果不满足再跳出循环
//但do while是先执行一次循环语句,再进行判断,真就继续执行循坏语句,假就退出循坏
//因此,不管如何,do while语句都至少会执行一次循环语句

break语句和continue语句

与while的break和continue语句基本相同

循环的嵌套

练习

找出100~200之间的素数,并打印在屏幕上。

#include <stdio.h>
#include <stdbool.h>
int main()
{
	_Bool sushu = 1;
	for (int i = 100; i <= 200; i++)
	{
		sushu = 1;
		int j = 0;
		for ( j = 2; j <= (i - 1); j++)
		{
			if (i % j == 0)
			{
				sushu = 0;
				break;
			}
		}
		if(sushu !=0)
		{
			printf("%d ", i);
		}
	}
	return 0;
}

这段代码还可以进行优化, 

#include <stdio.h>
#include <stdbool.h>
int main()
{
	_Bool sushu = 1;
	int l=0;
	for (int i = 101; i <= 200; i+=2)
	{
		sushu = 1;
		int j = 0;
		for ( j = 2; j <= (i - 1); j++)
		{
			if (i % j == 0)
			{
				sushu = 0;
				break;
			}
		}
		if(sushu !=0)
		{
			printf("%d ", i);
			l++;
		}
	}
	printf("\n%d", l);
	return 0;
}
//因为偶数不可能是素数,所以可以直接判断奇数

#include <stdio.h>
#include <stdbool.h>
#include<math.h>
int main()
{
	_Bool sushu = 1;
	int l = 0;
	for (int i = 101; i <= 200; i += 2)
	{
		sushu = 1;
		int j = 0;
		for (j = 2; j <= sqrt(i); j++)
		{
			if (i % j == 0)
			{
				sushu = 0;
				break;
			}
		}
		if (sushu != 0)
		{
			printf("%d ", i);
			l++;
		}
	}
	printf("\n%d", l);
	return 0;
}
//除了奇数判断外,还额外添加了根号sqrt
//a=b*c
//例如16=4*4=2*8,必有一个值会小于等于根号16,所以可以用sqrt来判断

goto语句 

实现在同一个函数内跳转到设置好的标号处

#include <stdio.h>
int main()
{
	printf("llll");
	goto flll;
	printf("2222");
	flll:
	printf("3333");
	return 0;
}

多用于快速跳出循坏,因为break语句只能跳出一层循坏,用goto语句可以快速跳出去

#include<stdio.h>
int main()
{
	for (int i = 1; i < 10; i++)
	{
		printf("%d ", i);
		if (i == 5)
		{
			goto tiaochuqu;
		}
	}
	printf("2222");
tiaochuqu:
	printf("\n1111");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值