C语言分支和循环注意事项

下面为大家分享自己近期在学习c语言分支和循环结构时候总结的一些知识点盲区

1.如果有多个if和else,else总是和最接近的if匹配

例:

int main()
{
	int a = 10;
	int b = 20;
	if (a == 1)
		if (b == 2)
			printf("haha\n");
	else
	printf("hehe\n");


	return 0;
}

如果你上来就判断a是10不等于1,然后执行else语句,打印hehe,但是如果你去运行代码就发现什么也没输出。输出见下图。

这是因为如果有多个if和else,else总是和最接近的if匹配,所以上 else 是和第二个 if 进行匹配的,这样后边的 if...else 语句是嵌套在第⼀个 if 语句中的,如果第⼀个 if 语句就不 成立,嵌套 if else 就没机会执行了,最终啥都不打印。其实上述代码可以写成如下:

int main()
{
	int a = 10;
	int b = 20;
	if (a == 1)
	{
		if (b == 2)
			printf("haha\n");
		else
			printf("hehe\n");
	}

	return 0;
}

2.if(x == 3)与if(x=3)完全不一样,后者表示对变量 x 赋值 3 ,它的返 回值为 3 ,所以 if 判断总是为真,为防止这种错误可以将变量写在等号右边if(3==x),这样如果将==写成=,编译器会报错。

3.多个运算符不宜连用,i < j < k ,并不是保证变量 j 在 i 和 k 之间,因为运算符是从左往右运算,执行的是如下表达式 ( i < j ) < k ,其中 i < j 返回0或1,最终是 0 或 1与 k 进行比较。如果想要判断  j 是否在i和k之间,可以使用 i<j && j<k这种用法。

4.三目操作符 exp1 ? exp2: exp3; 如果exp1表达式为真,执行exp2,exp2结果为整个表达式结果;如果exp1表达式为假,执行exp3,exp3结果为整个表达式结果。

5.c语言的逻辑运算符先对左边表达式求值,再对右边表达式求值。如果左边的表达式满足逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为短路。

对于&&操作符,例如:if(a>=5&&a<=10),当左边的操作数a>=5的结果为0时,即使不判断右边操作数a<=10,整个表达式的结果也为0。故对于&&操作符来说,左边的操作数结果是0时,右边的操作数不在执行。

对于||操作符,当左边的操作数结果不为0时,就无需执行右操作数

例:

#include <stdio.h>
int main()
{
 int i = 0,a=0,b=2,c =3,d=4;
 i = a++ && ++b && d++;//a = 1 ,b = 2,c = 3,d = 4,i=0
 //i = a++||++b||d++;//a = 1, b = 3,, c = 3 ,d=4 ,i=1
 printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
 return 0;
}

6.下面是switch的结构

switch (expression) {
 case value1: statement
 case value2: statement
 default: statement
}

注意switch 后的 expression 必须是整型表达式 ;case 后的值,必须是整形常量表达式。

case 和后边的数字之间必须有空格

每⼀个 case 语句中的代码执行完成后,需要加上 break ,才能跳出这个switch语句。在switch语句中,case子句和default子句没有顺序要求,只要顺序满足实际需求即可,通常是把default子句放在最后。

7.for循环的初始化,判断,调整三个表达式都可以省略,但是要注意如果省略了表示判断的部分,恒为真。

8.break和continue

break的作用是永久终止循环,只要 break 被执行,直接就会跳出循环,继续往后执行。只要break 被执行, break 外的第⼀层循环就终止了。continue 的作用是跳过本次循环 continue 后边的代码,继续进行下⼀次循环的判断,在 for 循环和 while 循环中有所差异的。f

下面是一个continue的代码:

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

	}
	return 0;
}

这里循环的调整是在 continue 后边,continue跳过了后边的调整部分会造成死循环。

int main()
{
	int i = 0;
	for (i = 1; i <= 10; i++)
	{
		if (i == 5)
			continue;
		printf("%d ", i);
	}

	return 0;
}

这里continue跳过了后边的打印,直接来到了i++的调整部分。所以不会造成死循环

9.goto语句,goto 语句可以实现在同⼀个函数内跳转到设置好的标号处。注意是在同一个函数内。

一般形式如下:

.
.
goto falg;
.
.
.

flag:
.
.
.
在多层循环的代码中,如果想快速跳出,使用 goto 就非常的方便了。
for (...)
{
	for (...)
	{
		for (...)
		{
			if (disaster)
				goto error;
		}
	}
}
error:
//...
本来 for 循环想提前退出得使用 break ,⼀个 break 只能跳出⼀层 for 循环,如果3层循环嵌套就得使用3个 break 才能跳出循环,所以在这种情况下我们使用  goto 语句就会更加的快捷。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值