去除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 int num = 8;”的时候重定义了,因为之前的“auto int num =1;”的地方已经定义过auto变量num。
说明在第二个auto变量num定义的时候,前一个num还没有结束,他们两是同一个num,对同一个变量重复定义当然会报错。
将两个代码块加上大括号后,编译通过,结果符合预期。
结合上一个分析,我们对第一个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的作用域才结束。
洛克定律:
有目标才会成功目标要“跳一跳,够得着”