俗话说,光说不练假把式,光练不说傻把式。说干就干,包不平心里早就在磨拳擦掌了。于是,他首先打开Microsoft Visual C++,在新建文件中输入了一下内容:
i=0;
int j=0;
auto s=0;
auto int k=0;
int auto p=0;
然后,编译,没有问题。竟然没有问题?是的!就是没有问题。惊讶、怀疑和好奇在包不平心里打转。奇了怪了,没有数据类型竟然也可以编译。这是为什么呢?难道有蹊跷?包不平抱着跃跃欲试的心态在最前面又加上了一行:
h;
再次编译。更诡异的事情发生了。没有数据类型,也没有初始化的值,竟然还是编译通过。算了,这里的水好深。还是先链接一下看看有没有问题。包不平,颤颤巍巍地点了一下链接按钮。出现了错误提示。包不平心里的大石头落下半边,心想“这肯定是编译器的问题”。定了定神一看,原来是需要main()函数。“好吧!先委屈一下,等下再来折腾你。”包不平默默地在后面添上了如下几行:
int main()
{
return 0;
}
再链接。竟然通过了。再运行。我勒个去!!!竟然能够运行!!!包不平心里甚是无辜,暗暗地抱怨老师、学校和整个中国的教育。心想,这回是掉到一大坑里面去了。也就想想,不然还能怎么办呢?自己掉到坑里,还是自己想办法爬起来吧!
包不平没心没肺地想,反正掉到坑里面去了,也不怕在掉一次。那我就来看看Dev-C++是不是也是这样!于是,用Dev-C++又做了一遍。发现只有int j=0;能够编译通过,并且还得有main()函数才行。这一下,包不平的心里更加迷惑了,难不成这两个集成环境还有什么不一样的?一不做,二不休。他又把所有的变量定义移到了main()函数中,在VC6.0下面注释掉h和i的定义后能编译运行。同样注释了h和i之后,在Dev-C++下程序竟然挂了!!!这是何解?
不是说好的,auto是宽宏大量的么?怎么在GCC下编译不能通过?虽说包不平是菜鸟一枚,不过他并没有慌乱,而是静下心思考和查找资料。于是,总结了以下几点:
1、 变量在定义时,是否初始化不影响编译
2、 如果C程序中没有main()函数,无法进行链接
3、 GCC编译器不允许在main()函数之外(或者全局区)使用auto关键字,VC6.0则允许。
4、 在(main函数中)定义变量是应有数据类型和变量名(严格来说还要有初始值)
5、 auto关键字修饰的变量通常叫做局部变量,也叫自动变量,当前变量的作用域为当前函数或代码段的局部变量,意味着当前变量会在内存栈上进行分配。。
6、 auto关键字修饰的是变量与数据类型无关
7、 VC6.0允许在全局区使用抽象意义上的变量(即只有变量名,没有数据类型也可),GCC则不允许
至此,包不平虽说不能深刻体会到C语言的精髓,但也对变量定义来了个刻骨铭心。