c语言循环分支语句(二)———常见的一些注意事项

1、悬空else问题

我们首先看下图的一个代码

#include <stdio.h>
int main()
{
	int a = 0;
	int b = 2;
	if (a == 1)
		if (b == 2)
			printf("hehe");
		else
			printf("haha");
	return 0;
}

在这里插入图片描述
如上图所示,我们一般上来就是直接判断 a 是 否为0,若不等于 1 ,那就执⾏ else ⼦句,打印 haha
但是当去运⾏代码,却发现输出的结果是:啥都不输出。
这是为什么的呢?
这就是悬空 else 的问题。

在理解这个之前我们需要了解一个规则:如果有多个 if 和 else ,可以记住这样⼀条规则, else 总是跟最接近的 if 匹配。

其实不难理解,上⾯的代码排版,让 else 和第⼀个 if 语句对⻬,让我们以为 else 是和第⼀个if匹配的,
当 if语句不成⽴的时候,⾃然想到的就是执⾏ else ⼦句,打印 haha ,但实际上 else 是和第⼆个 if进⾏匹配的,这样后边的 if…else 语句是嵌套在第⼀个 if 语句中的,如果第⼀个 if 语句就不成⽴,嵌套 if 和 else 就没机会执⾏了,最终啥都不打印。
但是如果想实现我们的想法我们应该如何解决呢?

#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、关系表达式一些易错

(1)“==”和“=”直接的区别

相等运算符 “==“ 与赋值运算符 “= ”是两个不⼀样的运算符,不要混淆。有时候,可能会不⼩⼼写出下⾯的代码,它可以运⾏,但很容易出现意料之外的结果。

“==”运算符号表示符号两边的值相等,是对两边的值进行比较
“=”是表示将等号右边的值直接赋值给左边,因此没有比较。
我们可以仔细对比两个之间的关系,不难发现两者区别较大。

比如a=0,b=3,若表达式为if(a==b),它的结果就为假,应为0不等于3;若表达式为if(a=b),它的结果就是1,这个的结果是恒成立的,不管a等于几,它表达的意思就是将b的值给a。

(2)多个关系运算符不宜连用。

如这个表达式

i < j < k

上⾯⽰例中,连续使⽤两个⼩于运算符。这是合法表达式,不会报错,但是通常达不到想要的结果,即不是保证变量 j 的值在 i 和 k 之间。
因为这个关系运算符的逻辑是从左到右计算,所以实际执⾏的是下⾯的表达式。

(i < j) < k

i < j 返回 0 或 1 ,所以最终是 0 或 1 与变量 k 进⾏⽐较。
如果想要判断变量 j的值是否在 i 和 k 之间,应该使⽤下⾯的写法

i < j && j < k

使用逻辑操作符,或用||,并用&&,! :逻辑取反运算符(改变单个表达式的真假)
这里需要补充的一点就是:它总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是保证的。如果左边的表达式满⾜逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为“短路。

if(month >= 3 && month <= 5)

表达式中&& 的左操作数是 month >= 3 ,右操作数是 month <= 5 ,当左操作数 month >= 3 的结果是0的时候,及时不判断 month <= 5 ,整个表达式的结果也是0(不是春季)。
所以,对于&&操作符来说,左边操作数的结果是0的时候,右边操作数就不再执⾏。
同理||操作符也一样,这里就不再做更多的叙述。

3、循环语句的注意事项

(1)swtich语句

1、switch 后的 表达式 必须是整型表达式
2、case 后的值,必须是整形常量表达式
3、default的位置可以放在前面,也可以放在后面,这个没有硬性要求
4、case 和后边的数字之间必须有空格
5、 每⼀个 case 语句中的代码执⾏完成后,需要加上 break ,才能跳出这个switch语句。
6、如果case语句后不加break,那么就会执行多条case语句,直到遇到break为止,这里可以根据需求灵活变换。
例子:

#include <stdio.h>
int main()
{
	int day = 0;
	scanf("%d", &day);
	switch (day)
	{
	case 1:
		printf("星期1\n");
		break;
	case 2:
		printf("星期2\n");
		break;
	case 3:
		printf("星期3\n");
		break;
	case 4:
		printf("星期4\n");
		break;
	case 5:
		printf("星期5\n");
		break;
	case 6:
		printf("星期6\n");
		break;
	case 7:
		printf("星期天\n");
		break;
	}
	return 0;
}
int main()
{
	int day = 0;
	scanf("%d", &day);
	switch (day)
	{
	default:
		printf("输入错误,请输入1~7的数字\n");
		break;
	case 1:
	case 2:
	case 3:
	case 4:
	case 5:
		printf("工作日\n");
		break;
	case 6:
	case 7:
		printf("休息日\n");
	break;
	
	}
	return 0;
}

对比这两例子可以发现其中的区别所在,不妨去运行试试看。

(3)while循环

while循环这里有一个易错点就是while()后面不要加分号,加分号就表示这是独立的语句,这里就会容易陷入while的死循环,就一直停留在这个语句上
这里while常用的语句就是实现多值输入

while(scanf("%d",&a)!=EOF)

4、break与continue

在循环执⾏的过程中,如果某些状况发⽣的时候,需要提前终⽌循环,这是⾮常常⻅的现象。C语⾔中提供了 break 和 continue 两个关键字,就是应该到循环中的。
• break 的作⽤是⽤于永久的终⽌循环,只要 break 被执⾏,直接就会跳出循环,继续往后执⾏。
• continue 的作⽤是跳过本次循环 continue 后边的代码,在 for 循环和 while 循环中有所差异的。
下面来看两个例子

#include <stdio.h>
int main()
{
 int i = 1;
 while(i<=10)
 {
 if(i == 5)
 continue;
 //当i等于5后,就执⾏continue,直接跳过continue的代码,去循环的判断的地⽅
 //因为这⾥跳过了i = i+1,所以i⼀直为5,程序陷⼊和死循环
 printf("%d ", i);
 i = i+1;
 }
 return 0;
}

到这⾥我们就能分析出来, continue 可以帮助我们跳过某⼀次循环continue 后边的代码,直接到循环的判断部分,进⾏下⼀次循环的判断,如果循环的调整是在 continue 后边的话,可能会造成死循环

#include <stdio.h>
int main()
{
 int i = 1;
 for(i=1; i<=10; i++)
 {
 if(i == 5)
 continue;//这⾥continue跳过了后边的打印,来到了i++的调整部分
 printf("%d ", i);
 }
 return 0;
}

所以在 for 循环中 continue 的作⽤是跳过本次循环中 continue 后的代码,直接去到循环的调整部分。未来当某个条件发⽣的时候,本次循环⽆需再执⾏后续某些操作的时候,就可以使⽤continue 来实现。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值