C语言块级变量在代码块内部定义的变量
所谓 代码块 ,就是由 { } 包围起来的代码。代码块在C语言中随处可见,例如函数体、选择结构、循环结构等。不包含代码块的C语言程序根本不能运行,即使最简单的C语言程序(上节已经进行了展示)也要包含代码块。
C语言允许在代码块内部定义变量,这样的变量具有块级作用域;换句话说,在代码块内部定义的变量只能在代码块内部使用,出了代码块就无效了。
上节我们已经讲解了函数,在函数内部定义的变量叫做局部变量,这节我们接着讲解选择结构和循环结构。
【实例1】定义一个函数 gcd(),求两个整数的最大公约数。 #include //函数声明 int gcd(int a, int b); //也可以写作 int gcd(int, int); int main(){ printf("The greatest common pisor is %d ", gcd(100, 60)); return 0; } //函数定义 int gcd(int a, int b){ //若a int sum(int m, int n); int main(){ printf("The sum from 1 to 100 is %d ", sum(1, 100)); return 0; } int sum(int m, int n){ int sum = 0; for(int i=m; i<=n; i++){ //i是块级变量 sum += i; } return sum; }
变量 i 定义在循环条件里面,所以是一个块级变量,它的作用域就是当前 for 循环,出了 for 循环就无效了。
如果一个变量只在 for 循环内部使用,就可以将它定义在循环条件里面,这样做可以避免在函数开头定义过多的变量,使得代码结构更加清晰,所以我鼓励大家这样做,当然,前提是你的编译器支持。
【实例2】定义一个函数 strchar(),查看给定的字符是否位于某个字符串中。 #include #include int strchar(char *str, char c); int main(){ char url[] = "http://c.biancheng.net"; char letter = "c"; if(strchar(url, letter) >= 0){ printf("The letter is in the string. "); }else{ printf("The letter is not in the string. "); } return 0; } int strchar(char *str, char c){ for(int i=0,len=strlen(str); i int main(){ int n = 22; //编号① //由{ }包围的代码块 { int n = 40; //编号② printf("block n: %d ", n); } printf("main n: %d ", n); return 0; }
运行结果:
block n: 40
main n: 22
这里有两个 n,它们位于不同的作用域,不会产生命名冲突。{ } 的作用域比 main() 更小,{ } 内部的 printf() 使用的是编号为②的 n,main() 内部的 printf() 使用的是编号为①的 n。 再谈作用域
每个C语言程序都包含了多个作用域,不同的作用域中可以出现同名的变量,C语言会按照从小到大的顺序、一层一层地去父级作用域中查找变量,如果在最顶层的全局作用域中还未找到这个变量,那么就会报错。
下面我们通过具体的代码来演示: #include int m = 13; int n = 10; void func1(){ int n = 20; { int n = 822; printf("block1 n: %d ", n); } printf("func1 n: %d ", n); } void func2(int n){ for(int i=0; i<10; i++){ if(i % 5 == 0){ printf("if m: %d ", m); }else{ int n = i % 4; if(n<2 && n>0){ printf("else m: %d ", m); } } } printf("func2 n: %d ", n); } void func3(){ printf("func3 n: %d ", n); } int main(){ int n = 30; func1(); func2(n); func3(); printf("main n: %d ", n); return 0; }
下图展示了这段代码的作用域:
蓝色 表示作用域的名称, 红色 表示作用域中的变量, global 表示全局作用域。在灰色背景的作用域中,我们使用到了 m 变量,而该变量位于全局作用域中,所以得穿越好几层作用域才能找到 m。
从华为mate40pro换到mate50pro,不吹不黑,憋了满肚子的话想说作为一个老花粉确实好不容易抢到了华为mate50pro,之前的mate40pro也是今年入得二手的,前前后后摔了不少次,但是真的好用,最近也是图新鲜,想体验一下最新的昆仑玻璃所以入
别让手机奴役了我们手机独白俺叫手机,身高约半尺,宽约几寸。曾用名有(手提电话,大哥大,掌中宝)等。自五十年前第一台俺的前辈问世以来,便受到无数时尚人士的热捧。从刚开始的1G到现在的5G时代,期间横跨
评分合理了?DXO公布iPhone14Pro成绩比前代提升了5分虽然DXO的评分数据已经没什么说服力了,但还是可以看看的,不合理再说。近日DXO就公布了iPhone14Pro的最新相机评分,拿下了146分的成绩,相比第一名仅差1分,比第三名的P
支付宝和微信的提现的手续费到底给谁了?随着移动支付渗透人们的生活中,人们不再带着现金出门,到哪都是使用微信支付或者支付宝支付,这些支付都是需要绑定我们的银行卡的。最近刷到几条短视频,感觉挺好笑的,里面的内容大致是微信和
是谁偷走了我们的流量?互联网时代,手机已成为我们不能离手的重要物品,而各种应用都离不开网络支持,手机流量尤为重要,因此生活中,当我们享受着手机带来的便利和乐趣时,也有不少人在抱怨流量用得太快,想当然认为
恒大还有救吗?烂尾楼9月12日又看到许老板出来发声要求恒大全国706个保交楼项目在9月30日必须全面复工,截止9月21日恒大公告称,公司已复工668个,未复工38个,已复工的668个项目中,有6
李书福出手!吉利控股收购阿斯顿马丁部分股权继沃尔沃戴姆勒路特斯等国际汽车品牌之后,李书福再次出手,这次收购的是英国著名百年汽车品牌的股份。9月30日晚,浙江吉利控股集团有限公司(吉利控股)有关人士对上证报记者确认,吉利控股
欧洲制造业大量外流,美国成最大受益者,美国给欧洲挖下了天坑俄乌冲突,随着时间的推移,对全世界的影响已经越来越大。战争造成的影响是有区域性的,但辐射而来的,经济层面的影响。已经波及了全世界大部分国家。通胀加息粮食能源,现在来看这场战争,真的
芯片大厂,跌跌不休过去很长一段时间困扰全球半导体业的芯片短缺,似乎有了明显的缓解。反映到资本市场上,由于市场需求放缓和芯片制造商的库存增加,整个半导体行业将出现低迷,于是投资者开始纷纷抛售半导体巨头
征信查询,哪些影响贷款?个人征信报告上最后一条公共信息是查询记录,其作用就是记录贷款(信用卡)申请人在金融机构申请时的查询日期查询机构和查询原因。查询分这几大类本人查询信用卡审批法人高管等资格审查担保资格
10月起,三轮车抢量大战,五羊宗申淮海美缔,都出手了请您在阅读前,先点击上面的关注。感谢您的支持,我们将为您带来更多有价值的内容。三轮车行业一直有着金九银十的说法,眼下已来到旺季时节,不少企业铆足了劲保障供应,想在旺季大干一场。最近