C语言入门学习——选择和循环语句及相关关键字

选择语句

if语句

1.if(表达式){语句;}
单分支结构
表达式:

用于判断是否执行语句,0为假,非0值为真;为真即执行。例如:if(0)和if(1),if(1)执行
执行逻辑:
当if表达式中为真,则执行下面的语句,为假则不执行
示例:

int main()
{
	int age = 0;
	scanf("%d",&age);
	if(age>18)				//当输入的值大于18即判定为真,执行下面语句
		printf("成年\n");	//语句
	return 0}

并列情况
当出现交叉关系,可并列使用if
示例:求闰年

int main()
{
	int temp1 = 0;
	scanf("%d",&temp1);
	if(temp1%4 == 0 && temp1%100 != 0)	//对可以对4整除,对100不整除			
		printf("是闰年\n");				//语句
	if(temp1%400 == 0)					//对400取余不为0即 被整除
		printf("是闰年\n");				//语句
	return 0}

如上述示例,当出现多种情况需要判断,就可使if并列使用

2.if(表达式){语句1;}else{语句2;}
双分支结构
执行逻辑:
当表达式为真时,执行语句1,否则(表达式为假)执行语句2
示例:

int main()
{
	int age = 0;
	scanf("%d",&age);
	if(age>=18)					//表达式
		printf("成年\n");		//表达式为真则执行语句1
	else
		printf("未成年\n");		//表达式为假执行语句2
	return 0}	

虽然是双分支结构,但只执行一次

3.if(表达式1){语句1;}…else if(表达式n){语句n;}else{语句n+1;}
用于多分支结构
执行逻辑:
当表达式1为真时,执行语句1;若表达式1为假时,则表达式2为真时,执行语句2以此类推;直到其中一个表达式为真时,执行该表达式下的语句。
示例:

int main()
{
	int age = 0;
	scanf("%d",&age);
	if(age<18)
		printf("青少年\n");
	else if(age>=18 && age<30)		
	//不可以(18<=age<30)这种型式写,按照操作符的顺序,假设给10,10小于age为假(0),0<30为真,但10岁不满足此分类要求
		printf("青年\n");
	else if(age>=30 && age<50)
		printf("中年\n");
	else if(age>=50 && age<80)
		printf("中老年\n");
	else if(age>=80 && age<100)
		printf("老年\n");
	else
		printf("老寿星\n");
	return 0;
}

注意:
1.虽然上述示例判断条件多,但也是只执行1次,只有并列if时才是每个都执行。
2.无论是上述哪种情况,当表达式下的语句不止一条时,应加上 { } 。

4.常见误区
1.

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相结合,所以应该书写规范与if(b == 2)对齐。
若想让if(a == 1)相结合,需要用 { 把if( b== 2)和他的语句 } 括起来,因为此时if(a == 1)的执行语句变为两条。
如:

	if(a == 1)
	{						
		if(b==2)
		printf("hehe\n");
	}
	else						
		printf("haha\n");
int add()
{
	int a = 1;
	int b = 2;
	if(a==2)
		return 0;
	return 1;					//应此处加上else,否则容易误解
}
int main()
{
	int x = add();
	printf("%d\n",x);			//输出结果为1
	return 0;
}

return的作用一是返回值,二是结束该函数,上述代码容易让人误解,实际应在return1加上else。
3.

int main()
{
	int a = 1;
	if(a=5)					//应改为 a==5				
		printf("hehe\n");
//	if(5==a)				//当出现赋值符号的判断时,可以把变量写在左边	
//		printf("hehe\n");	//这样在编译时,如果漏丢 '=' 会提示报错
	return 0;
}

应该是a==5,但a=5也输出了hehe,实际操作中类似情况容易出现错误
在表达式中如果存在赋值符号,可以把数放左边。
以上几种情况均属于书写风格的问题,所以在平时练习时要多多注意规范编写,避免以后的编写出现不必要的障碍。

switch语句

当出现多分支场景时,多次使用if(){ } else if(){ }可能会繁琐,此时可以使用switch语句
switch语句的基本格式:

switch(表达式)
{
	case 常量1:
		要执行的语句;
	case 常量2:
		要执行的语句;
	case 常量3:
		要执行的语句;
	case 常量4:
		要执行的语句;
}	

和if一样若是语句大于1需要加 { }
注意,表达式中可以是变量、常量,但必须是整型数据类型
执行逻辑:
当表达式中的整数或变量与 case 前的常量相同时,执行该case下的语句;但是,执行完该语句还会执行后续case的语句。
此时应在每个执行语句后面加上 break 如:

加break

switch(表达式)
{
	case 常量1:
		要执行的语句;
		break;
	case 常量2:
		要执行的语句;
		break;
	case 常量3:
		要执行的语句;
		break;
	case 常量4:
		要执行的语句;
		break;
}	

这时表达式与case匹配时,执行该case下的语句后不会再继续执行后面case的语句了。
若,表达式与case 中的常量没有相匹配时,应再加上 default 如:

加default

switch(表达式)
{
	case 常量1:
		要执行的语句;
		break;
	case 常量2:
		要执行的语句;
		break;
	case 常量3:
		要执行的语句;
		break;
	case 常量4:
		要执行的语句;
		break;
	default:
		case没有的情况时要执行的语句;	
}	

default可以加在开头也可以加在末尾,但在开头时要加上 break 防止影响后续的代码。

示例1:每个case都加break的情况

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;					//若不添加break 则会继续执行剩余case的语句,
	case 7:
		printf("周日\n");
		break;					//braek的作用是 停止/跳出
	default:					//default的作用是case不包含的情况
		printf("输入错误\n");
	}
	return 0;
}

示例2:个别case后加break的情况

int main()
{
	int day = 0;
	scanf("%d",&day);
	switch(day)
	{
	default:					
		printf("输入错误\n");
		break;					//default在开头要加上break
	case 1:
	case 2:
	case 3:
	case 4:
	case 5:
		printf("工作日\n");
		break;
	case 6:
	case 7:
		printf("休息日\n");
		break;
	}
	return 0;
}

循环语句

while循环语句

基本格式:

	while(表达式)
	{
		要执行的语句
	}

和if一样若是语句大于1需要加 { }
while表达式与if表达式大致相同,所以执行逻辑为,表达式为真,则执行语句,为假则不执行;当从真变为假时,先继续执行到最后一条语句与表达式比较后判定为假,则跳出循环
示例1:打印数字1——10

int main()
{
	int i = 1;
	while(i<=10)
	{
		printf("%d\n",i);
		i++;
	}
	return 0;

break在while中的现象
示例2:

int main()
{
	while(i<=10)
	{
		if(5==i)
			break;			
		printf("%d\n",i);//输出结果是 1 2 3 4
		i++;
	}
	return 0;
}

该程序说明 break 在while中是永久停止/跳出该循环的

continue在while中的现象
示例3:

int main()
{
	int i = 1;							
	while(i<=10)
	{
		if(5==i)
			continue;		//直接跳到判断表达式位置即将(i<=10)位置处
		printf("%d\n",i);	//输出结果是 1 2 3 4—死循环
		i++;				
	}
	return 0;
}

continue的作用是忽略后面程序,直接跳到判断表达式位置
上述输出结果出现死循环,因为i加到5时会跳到判断表达式,之后继续执行if,接着再跳到判断表达式直至———死循环

while处理scanf留下的换行符
在使用scanf时,先是从键盘向键盘缓冲区输入,之后按回车时,输入的数据被送入到程序由变量接受,但会再键盘缓冲区留下一个换行符,若是下次想输入输出字符或字符串时,会受影响
在这里插入图片描述
这时可以使用while+putchar来处理

int main()
{		
	//while((ch = getchar()) != EOF)	//输入错误或读取到末尾会返回EOF (EOF=-1)
	//putchar(ch);						//按ctrl+z会让getchar返回EOF
										//最好用int 接收putchar等函数的返回值,因为char型太小最大范围是128,存在超出范围的风险
										//上述循环体的作用是,打印每次输入的字符或者字符串,ctrl+z停止
	
	int password[20] = {0};
	int ch = 0;
	int temp = 0;
	printf("请输入密码:");
	scanf("%s",password);				//在输入密码时 如123456但是按下回车时,会在键盘缓冲器留下一个'\n',处理不好会令后续读取字符时读取到换行符
	//方法一
	//getchar();						//getchar会先在缓冲区读取字符
	//方法二
	while((temp = getchar()) != '\n');	//或者直至等待该次输入完成后读取到换行符时跳出循环
	printf("请确认密码(Y/N):\n");		
	ch = getchar();						
	if('Y'== ch)
		printf("确认成功\n");
	else
		printf("确认失败\n");
	return 0;
}

可以如上所示使用while避免\n被错误读取

for循环语句

基本格式:

for(表达式1;表达式2,表达式3)
{
	语句;
}

和if一样若是语句大于1需要加 { }
执行逻辑:
先执行表达式1,再判断行表达式2是否为真,若为真则执行语句,之后执行表达式3,再与表达式2判断,直至为假跳出循环
示例1:打印1——10

int main()
{	
	int i = 0;
	for(i=1;i<=10;i++)					
		printf("%d\n",i);
	return 0;
}
//令i=1,再判断是否小于等于10,为真执行打印函数,之后令i自增在于10进行判断直至大于10(为假)退出循环

break在for中现象
示例2:

int main()
{
	int i = 0;
	for(i = 1;i <= 10; i++)
	{
		if(5==i)
			break;				//break会终止/跳出循环
		printf("%d\n",i);		//输出结果:1234
	}
	return 0;
}

break会 跳出\退出 循环,最后输出结果到4截至

continue在for中的现象
示例3:

int main()
{
	int i = 0;
	for(i = 1;i <= 10; i++)
	{
		if(5==i)
			continue;			//continue会直接跳到表达式最右端,即 i++位置
		printf("%d\n",i);		//输出结果 1 2 3 4 6 7 8 9 10
	}
	return 0;
}

continue会跳到for循环最右侧表达式3,最后输出结果没有5

for的一些变种示例
1.没有任何表达式

	for(;;)
		printf("hh\n");					//会一直输出

等同于while(1)是个死循环

2.相乘形式

	for(i=0; i<10; i++)
	{
		for(j=0; j<10; j++)
			printf("hh\n");			//hh打印了100次
	}

相当于 10乘10
注意: 在最里层添加break,只会对最里层的break管用

3.取消赋予初始值

	for(; i<10; i++)
	{
		for(; j<10; j++)
			printf("hh\n");			//hh打印了10次,因为第一个i的十次结束后,j并没有赋予初始值
	}

只会打印十次,因为当110退出时,j=11,再次进入时是从11开始 即111

除了以上三种,还可在for中使用多个变量,函数等

do—while循环语句

基本格式:

do
{
	语句;
}while(表达式)//注意符号 ;

执行逻辑:
先执行一遍语句,在对表达式进行判断,为真则继续执行,为假则退出
所以do—while使用的时候很少,适用于必须先执行一次的情况
示例1:打印1——10

int main()
{
	int i = 1;	
	do
	{
		printf("%d\n",i);				//先执行
		i++;
	}while(i<=10);					//后判断
	return 0;
}

break在do—while中的现象
示例2:

int main()
{
	int i;
	do
	{
		printf("hh\n");				//打印 1-4
		i++;
		if(5==i)
			break;
	}while(i<=10);
	return 0;
}

输出结果为打印至4截至

continue在do—while中的现象
示例3:

int main()
{
	int i;
	do
	{
		printf("hh\n");				//打印到4后开始死循环
		i++;
		if(5==i)
			continue;
	}while(i<=10);
	return 0;
}

continue跳到表达式最后侧,while就一个表达式所以与while循环相同,导致死循环

总结

1.if多分支的时候不管有多少,只执行一次,并行if是每个都执行
2.对于 “==” 带赋值符号是可以考虑变量写左边
3.注意switch的break与default的细节
4.break会退出循环,且break只退出距离最近的循环
5.continue会跳到循环表达式的最右侧
6.对于大于一条语句时要加上 { }
7.注意书写格式的对齐

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值