编译器优化问题

今天同学在群里火急火燎的@我还以为有什么事要发生呢,结果发了一段代码出来,大概是这个意思:

1
2
3
4
5
6
7
8
#include <stdio.h>
int main()
{
int n;
scanf("%d", &n);
int data[n];
return 0;
}

第一反应是这代码是哪个傻逼新生写得呢!结果,他说这个代码GCC编译通过了,当然我也试了一下,VS不用编译就有红色的下划线了,Dev C++用GCC编译确实是通过了,等等,我想静静,那么问题来了,静静是谁?难道是GCC编译器有bug?上C语言课老师可是反复强调C/C++没有变长数组啊(除非new一个),可GCC编译器是经过这么多人测试全球都在使用的东西啊,这作何解释呢?

结论是编译器智能了。它懂你的意思。就不要那么古板了,它为什么可以这么做呢?这样不是违反了C标准吗?要从C标准说的话就有话说啦,C标准规定了不能有变长数组,但是C标准为了程序运行效率没有做越界处理,是否越界全靠程序员决定,而这一点正好给了编译器发挥的余地,每一个进程开始运行的时候操作系统总会分一个栈给它,编译器便是利用这个栈来实现这个“变长数组”的,至于个中细节,还需推敲。

几乎每一个编译器对这种C标准比较模糊的概念都有自己的解释。

0%