分支语句和循环语句

<一>分支语句

//if语句

  • if-else语句的语法结构:
//类型1:
if(表达式)
	语句1
//类型2:
if(表达式)
	语句1
else
	语句2
//类型3
if(表达式)
	语句1
else if(表达式)
	语句2
else
	语句3
  • 悬空else:else与最近的if匹配
int main()
{
	int a = 0;
	int b = 0;
	if(a==1)
		if(b==2)
			printf("hehe");
	else
		printf("haha\n");
	return 0;
}

以上程序最终没有输出,C语言不按照缩进进行匹配,此时的else是与if(b==2)进行匹配
如果要进行if-else的合理匹配,良好的代码风格是每个if-else之后加上一个代码块{},以便进行分割

  • if书写形式的对比:
//代码1
if(condition)
{
	return x;
}
return y;

//代码2
if(conditon)
{
	return x;
}
else
{
	return y;
}

//代码3
int num = 1;
if(num == 5)
{
	printf("hehe\n");
}

//代码4
int num = 1;
if(5 == num)
{
	printf("hehe\n");
}

在以上的代码中:代码1和2中,虽然两者都能运行同样的功能,代码2运用了代码块运用了代码块,层次更清晰;代码3和代码4中,有很多人将代码块的判断条件的等于号写成赋值符,如果按照代码三的运行方式,可能程序没有出现bug,代码依旧运行出错误的结果,难以找寻,但是代码4的存在可以便于我们发现代码出现错误情况.如果只是写上一个等号,那么此时便成为变量赋给常量,系统必定报错,我们也能够发现问题,而避免错误的程序运行出错误的结果.

注:if-else后如果不加大括号,默认执行其后的第一条语句.

switch语句

  • switch语句结构:
switch(整形表达式)
{
	//语句项;
}

switch后必须为整形常量(const int a = 10,a为整形常变量也不可以)

  • switch语句和case,break和default的搭配:
//代码1
switch(day)
{
	case 1:
		printf(.....);
	case 2:
		printf(.....);
	.....:
	case 7:
		printf(.....);
}
//代码2
switch(day)
{
	case 1:
		printf(.....);
		break;
	case 2:
		printf(.....);
		break;
	.....:
	case 7:
		printf(.....);
		break;
}
//代码3
switch(day)
{
	case 1:
		printf(.....);
		break;
	case 2:
		printf(.....);
		break;
	.....:
	case 7:
		printf(.....);
		break;
	default:
		printf(......);
		break;		
}

代码1:如果此时输入1,那么代码会执行case 1的语句,然后一直执行下面的语句直到switch全部语句 执行完
代码2:有了break语句,输入对抑制跳到对应语句,并且执行完成时,会跳出switch语句
代码3:有了defalut语句,如果输入值没有在case中找到对应的,那么就会自动跳转至case语句,且default语句可以放在switch语句体的任何地方

  • 代码1(加上defalut子句之后)和代码3在不同的情况下有不同的适用

<二>循环语句

//while语句

  • 语法结构:
    在这里插入图片描述
while(表达式)
	循环语句;
  • while语句中的break和continue:
break:跳出整个循环,直接终止循环

while(i<=1)
{
	if(i == 5)
		break;
	printf("%d",i);
	i++
}

continue:跳过循环后面所有语句,直接返回下一次循环的判断入口

while(i<=10)
{
	if(i == 5)
		continue;
	printf("%d",i);
	i++;
}

程序1的结果:1 2 3 4
程序2的结果:1 2 3 4 +∞ 死循环(无法改变判断条件里的变量所导致)

getchar()和putchar()

//getchar:获取字符
int getchar(void);
//putchar:输出字符
int putchar(int character);

getchar与scanf的区别:getchar会读取\0,空格等相同类型字符,而scanf不会读取这些
但是两者都是先从缓冲区读取字符,然后再从我们键盘中输入的地方读取字符

在这里插入图片描述

//基本演示
int main()
{
	int ch = 0;
	while((ch = getchar()) != EOF)//将收到的字符转换为ASCLL码存入ch中
					putchar(ch);
	return 0;
}
//全输出英文字符和数字字符
int main()
{
	int ch = 0;
	while((ch = getchar())!=EOF)
	{
		if(ch <'0' && cha>'9')
		//if(ch < 'a' && ch > 'z')
		//if(ch < 'A' && ch > 'Z')
			continue;
		putchar(ch);
	}
	return 0;
}
//清除缓冲区
int main()
{
	char passwords[20] = {0};
	printf("请输入密码:");
	scanf("%s",passwords);
	int tmp = 0;
	while((tmp == getchar())!='\0');
	//清理除字符以外的所有符号,清理缓冲区
	printf("请输入Y或者N:");
	int ch = 0;
	ch = getchar();
	if(ch == 'Y')
		printf("right");
	else
		printf("left");
	return 0;
}

//for语句

  • 语法结构:
for(表达式1;表达式2;表达式3)
		循环语句;

表达式1:初始化部分,初始化循环变量
表达式2:条件判断部分,用于判断循环时候终止
表达式3:调整部分,用于循环的调整

在这里插入图片描述

for语句中的break和continue语句

//代码1
int main()
{
	int i = 0;
	for(i=1;i<=10;i++)
	{
		if(i==5)
			break;
		printf("%d ",i);
	}
	return 0;
}

//代码2:
int main()
{
	int i = 0;
	for(i=1;i<=10;i++)
	{
		if(i==5)
			continue;
		printf("%d ",i);
	}
	return 0;
}
  • for循环中的break语句和while语句一样,是跳出该循环
  • 但for循环中continue是跳到for循环的调整部分,而不是像while一样跳到判断部分
  • for循环中的break语句和while语句一样,是跳出该循环
  • 因此代码1的结果与while相同,而代码2的结果为:1 2 3 4 6 7 8 9 10

注意:不要在for循环体内修改循环变量,防止失去控制

for循环语法结构的变种

<1>for循环的三个变量都可以省,但分号不可以省,一般不建议略

int main()
{
	for( ; ; )
	{
		printf("hehe");//无限打印
	}
	return 0;
}

<2> 代码2中外循环和内循环次数的乘积即为总共输出的次数
代码3中因为第一次循环时,结果为:i=0,j=10;因为没有初始化,当i=1时进入内循环,j=10保持不变,所以内循环直接结束,后面同理,一共循环了10次

//代码2:
int i = 0;
int j = 0;
for(i = 0;i<10;i++)
{
	for(j = 0;j<10;j++)
	{
		printf("hehe\n");
	}
}

//代码3:
int i = 0;
int j = 0;
for(;i<10;i++)
{
	for(;j<10;j++)
	{
		printf("hehe\n");
	}
}

<3>使用多余一个变量控制循环

int main()
{
	int x,y;
	for(x = 0,y = 0;x<2 && y>5;x++,y++)
	{
		printf("hehe\n");
	}
	return 0;
}

do-while循环

  • 语法结构:
do{
	循环语句;
}while(表达式);

在这里插入图片描述
特点:循环至少使用一次

do-while循环中的break和continue语句

  • 与while语句一摸一样

goto语句

语句特点:多用于跳出多重循环

int main()
{
flag:
	printf("hehe"\n);
	goto flag;
	return 0
}
//死循环

使用goto语句,只要给定跳出标签,可以跳出多重循环,也可以造成死循环

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值