都什么时代了,老谭的书还用VC6.0, 编译器那么老(好像是c89之前了,比较新的是c99标准)对标准支持不好,真是阻碍中国计算机教育的进步。
最近几个编译器来回换,蓝桥杯好像只给vc6.0,发现还是g++的编译器比较好,编译出的代码执行速度更快一点,对标准支持的最好。
看这一段很简单的代码:
1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 int main() 5 { 6 int n; 7 cin >> n; 8 int a[n]; 9 int b[n]; 10 for (int i = 0; i < n; ++i) 11 cin >> a[i]; 12 for (int i = 0; i < n; ++i) 13 cin >> b[i]; 14 return 0; 15 }
用g++完全没问题,没有任何waring或者error,但是用vc6.0的话就会一堆错误:
t.cpp(8) : error C2057: expected constant expression
t.cpp(8) : error C2466: cannot allocate an array of constant size 0
t.cpp(8) : error C2133: 'a' : unknown size
t.cpp(9) : error C2057: expected constant expression
t.cpp(9) : error C2466: cannot allocate an array of constant size 0
t.cpp(9) : error C2133: 'b' : unknown size
t.cpp(12) : error C2374: 'i' : redefinition; multiple initialization
t.cpp(10) : see declaration of 'i'
纠结了一阵终于明白了,首先vc6.0中(即使较新的vc++2010)也不允许定义变长数组,但是c99标准已经支持变长数组,所以可以用a[n]直接创建变长数组,下标可以是变量。c99规定,变长数组必须是自动存储类。(变长数组中的”变"意思是说其维数可以用变量指定,而不是说创建数组后可以修改其大小)
另外一点就是vc6.0中在for语句中创建的变量 i 的作用域问题,c99规定for语句中的 i 只在该for 语句中有效,但是vc6.0中for语句中的 i 却是在后面所有作用域都有效,所以就出现了重复定义问题。
知道了原因,修改编译错误就是小菜了。当然还有其他一些不合标准的地方,反正不用这玩意了。还是建议用最新的编译器,逐渐淘汰不符合标准的。