C易错注意之分支循环,悬空else,短路表达式,static

接下来的日子会顺顺利利,万事胜意,生活明朗-----------林辞忧 

前言: 

c语言中一些关于分支循环中continue常混淆,悬空esle问题,短路表达式,static ,extern在使用时稍不注意就会出错的点,接下来我们将介绍这些易错的内容

一:深入理解分支语句

1.对于分支语句有很多结构

如if() else语句,if()    else if ()  esle if ()    else  语句,还有if语句中嵌套if  else 语句的,对于这些语句要注意使用时的条件是否合理

2.对比两种结构 if()  if()  和 if()  else if()  else 使用时的不同

3.举例:计算1~100之间出现的9的个数

对于上面两种计算方式,会发现会有差别,出现这种的原因为if() if()在运行时每个数都会执行,而对于if() else if() 在运行中只会选择运行一个,在99时只算了一个9,导致结果出错 ,所以使用需要注意这一点

二:悬空else问题

1.举例

2.结果分析 

运行得知,此程序执行结果为无,好像程序中是打印haha,但else只有一个,有两个if结构,此时就会出现匹配问题

3.悬空else处理规则

else总是与最近未匹配的if结构匹配

所以上面例子就是判断a==1时,条件不成立,因为无匹配的else结构,程序啥也不输出

三:短路表达式

1.&&逻辑与的短路(左为假,右不再执行)

int a=0,b=3,c=4;
a++&& b++ && c++;
printf("%d,%d,%d",a,b,c);

对于这个表达式,由于是a++,a先使用后++,所以a++的结果为0,此时逻辑与&& 发生短路,后面的b++,c++不再执行,所以结果为1,3,4 

2.||逻辑或的短路(左为真,右不再执行)

int a=1,b=2,c=3;
a++ || b++ ||c++;
printf("%d,%d,%d",a,b,c);

此程序的运行结果为2,2,3

四:三种循环结构中的break,continue语句 

1.break语句

break语句在三种循环结构中一致,都是用来终止程序的,跳出循环

2.while ,do while 语句与for语句中continue的不同

continue的作用是跳过本次循环后面的语句,直接到判断部分(while  do while)或者调整部分

会发现对于while循环跳过continue后面的语句,就会造成死循环,原因是当i==5时,continue跳过后面语句,直接到判断部分,导致i++未执行,i一直为5,造成死循环

五:static 和extern

1.static

static是静态的意思,可以修饰函数,局部变量,全局变量

2.作用于和生命周期

作⽤域(scope)是程序设计概念
,通常来说,⼀段程序代码中所⽤到的名字并不总是有效(可⽤)
的,⽽限定这个名字的可⽤性的代码范围就是这个名字的作⽤域。
1. 局部变量的作⽤域是变量所在的局部范围。
2. 全局变量的作⽤域是整个⼯程(项⽬)。
⽣命周期指的是变量的创建(申请内存)到变量的销毁(收回内存)之间的⼀个时间段。
1. 局部变量的⽣命周期是:进⼊作⽤域变量创建,⽣命周期开始,出作⽤域⽣命周期结束。
2. 全局变量的⽣命周期是:整个程序的⽣命周期。

3.static的作用

1.static修饰局部变量改变了变量的⽣命周期,⽣命周期改变的本质是改变了变量的存储类型,本
来⼀个局部变量是存储在内存的栈区的,但是被 static 修饰后存储到了静态区。存储在静态区的变
量和全局变量是⼀样的,⽣命周期就和程序的⽣命周期⼀样了,只有程序结束,变量才销毁,内存才 回收。但是作⽤域不变的。
2.⼀个全局变量被static修饰,使得这个全局变量只能在本源⽂件内使⽤,不能在其他源⽂件内使⽤。
本质原因是全局变量默认是具有外部链接属性的,在外部的⽂件中想使⽤,只要适当的声明就可以使 ⽤;但是全局变量被 static 修饰之后,外部链接属性就变成了内部链接属性,只能在⾃⼰所在的源 ⽂件内部使⽤了,其他源⽂件,即使声明了,也是⽆法正常使⽤的

4.extern

extern 是⽤来声明外部符号的,如果⼀个全局的符号在A⽂件中定义的,在B⽂件中想使⽤,就可以使
extern 进⾏声明,然后使⽤。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值