auto 关键字的使用

tech2022-08-19  134


本文用简单代码实验介绍了auto关键字的使用。

上代码

#include <stdio.h> int main(void) { int i; int num = 2; for (i=0; i<3; i++) { printf("num = %d\n", num); num++; { auto int num = 1; printf("the internal block num = %d\n", num); num++; } } return 0; } /* 运行结果: num=2 the internal block num = 1 num=3 the internal block num = 1 num=4 the internal block num = 1 */

改代码

去除auto代码块上的大括号。

#include <stdio.h> int main(void) { int i; int num = 2; for (i=0; i<3; i++) { printf("num = %d\n", num); num++; auto int num = 1; printf("the internal block num = %d\n", num); num++; } return 0; } /* 运行结果: num=2 the internal block num = 1 num=3 the internal block num = 1 num=4 the internal block num = 1 */
对比1

两者结果一样,是否加大括号对目前不影响,难道加大括号是多余的吗?

结论1

百度:具有自动存储期的变量在进入声明该变量的程序块时被建立,它在该程序块活动时存在,退出该程序块时撤销。

我:“退出程序块活动” 具体是什么样的情景?


继续改代码

#include <stdio.h> int main(void) { int i; int num = 2; for (i=0; i<3; i++) { printf("num = %d\n", num); num++; auto int num = 1; printf("the internal block num = %d\n", num); num++; auto int num = 8; printf("the second internal block num = %d\n", num); num++; } return 0; } /* 运行结果: 042.c: In function 'main': 042.c:21:15: error: redefinition of 'num' 21 | auto int num = 8; | ^~~ 042.c:17:15: note: previous definition of 'num' was here 17 | auto int num = 1; | ^~~ */
分析

运行出错,提示在 “auto int num = 8;”的时候重定义了,因为之前的“auto int num =1;”的地方已经定义过auto变量num。

说明在第二个auto变量num定义的时候,前一个num还没有结束,他们两是同一个num,对同一个变量重复定义当然会报错。


继续看

#include <stdio.h> int main(void) { int i; int num = 2; for (i=0; i<3; i++) { printf("num = %d\n", num); num++; { auto int num = 1; printf("the internal block num = %d\n", num); num++; } { auto int num = 8; printf("the second internal block num = %d\n", num); num++; } } return 0; } /* 运行结果: num=2 the internal block num = 1 the second internal block num = 8 num=3 the internal block num = 1 the second internal block num = 8 num=4 the internal block num = 1 the second internal block num = 8 */
分析

将两个代码块加上大括号后,编译通过,结果符合预期。

结合上一个分析,我们对第一个auto变量所在代码块加大括号后,它就和后面的auto变量num不冲突了,也就是说这里两个代码块之间的反大括号 “ } ” 起了作用。


大总结

结合上面4个实验,可以知道auto变量num的作用域为:num从定义的地方开始,一直往下执行,直到遇见的第一个包含该auto变量的反大括号,结束auto变量num的作用域。

但是,我们不能单独使用反大括号来结束auto变量的作用域,否则该反大括号会与之前的某个正大括号相互作用,改变了代码的原意。

所以,auto变量所在代码块要用一对大括号括起来。


补充

所有的非全局变量的缺省值假定为auto。

例如:下图main函数中的局部变量i

#include <stdio.h> int main(void) { int i; int num = 2; for (i=0; i<3; i++) { printf("num = %d\n", num); num++; { auto int num = 1; printf("the internal block num = %d\n", num); num++; } } return 0; } /* 运行结果: num=2 the internal block num = 1 num=3 the internal block num = 1 num=4 the internal block num = 1 */

i也是auto变量,它的作用于从定义的地方开始,一路向下执行,遇到第一个反大括号,但是i发现它不包含自己,继续向下走,又遇见一个,还是不包含自己,直到第三个反括号才包含自己,这时i的作用域才结束。





阅读摘抄分享:

洛克定律:

有目标才会成功目标要“跳一跳,够得着”
最新回复(0)