C语言菜鸟的奇葩经历 第一回 小试牛刀VC6.0大跌眼镜 班门弄斧GCC一夫当关

本文通过包不平的编程实践,探讨了C语言中变量定义的规则,包括初始化、作用域、关键字使用等方面的不同编译器行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

俗话说,光说不练假把式,光练不说傻把式。说干就干,包不平心里早就在磨拳擦掌了。于是,他首先打开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语言的精髓,但也对变量定义来了个刻骨铭心。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值