这段代码在 gcc 下可以通过,为什么声明数组的时候,数组大小可以是变量呢,一直都以为声明数组大小只能是常量,除了使用动态内存分配。
int fib(int n) {
if (n == 0)
return 0;
if (n == 1)
return 1;
int f[n+1];
int i;
f[0] = 0; f[1] = 1;
for (i = 2; i <= n; i++)
f[i] = f[i-1] + f[i-2];
return f[n];
}
int main () {
int n = 9;
printf("fib number is %d\n", fib(n));
return 0;
}
1
diangdiang OP 实在没搞懂,求别沉
|
2
erenno1 2017-01-20 10:45:55 +08:00
猜测是编译器做了优化了,你可以尝试下 main 函数里使用 for 循环对 n 赋值,估计就编译不了了
|
3
skydiver 2017-01-20 10:47:27 +08:00 via Android
C11 支持可变长数组。
结贴。 |
4
enenaaa 2017-01-20 10:47:28 +08:00 1
c99 标准, 变长数组。
|
6
assassinpig 2017-01-20 10:51:13 +08:00
编译器帮你忙 你换个 vc 编译器试试看
|
7
diangdiang OP @编译时没用 c11 选项,看来我一直误解了,不知道以前是从哪里看到的,静态数组只能用常量指定大小。
多谢各位 |
8
azh7138m 2017-01-20 10:56:44 +08:00 via Android
|
9
rogerchen 2017-01-20 11:13:22 +08:00 2
|
10
rogerchen 2017-01-20 11:14:32 +08:00 1
|
11
saintaugustinus 2017-01-20 11:17:13 +08:00 via iPhone 1
标准是 C99 开始支持 VLA
但是 gcc 是一直都支持 VLA http://stackoverflow.com/questions/4159746/variable-length-arrays-in-c89 |
12
diangdiang OP @rogerchen 涨知识了。 也就是说这个特性不是 ISO C 标准的,只是 gcc 自己的扩展,别的 c 编译器如 vc 或者 clang 有可能不支持?
|
13
diangdiang OP @saintaugustinus 这样啊,多谢了
|
14
irenicus 2017-01-20 11:48:19 +08:00
gcc 的特性
以前我给一个同事说 c 语言不能在函数里定义函数,同事不信,写了一个然后 gcc 编译通过了。。。 后来才知道这只是 gcc 的特性 |
15
holy_sin 2017-01-20 11:49:11 +08:00 2
楼主被谭浩强害了
|
16
nicevar 2017-01-20 11:53:28 +08:00
学过汇编的话,直接看编译产生的汇编代码
|
17
bboysoul 2017-01-20 12:14:00 +08:00
我也考虑过这个问题
|
18
hx1997 2017-01-20 12:55:08 +08:00
哈哈哈哈哈哈哈,谭浩强,我们过去的那学期学他的第四版,看到的时候都无语了(虽然我也没怎么看
|
19
Lonely 2017-01-20 13:03:22 +08:00
最近看 CSAPP ,正好看到有提到说是 ISO C99 允许数组的长度是表达式
|
20
kokutou 2017-01-20 13:10:11 +08:00 via Android
楼主可能是谭浩强的受害者。。。
|
21
langjiyuan 2017-01-20 13:10:38 +08:00
谭浩强+1
|
22
wohenyingyu02 2017-01-20 13:48:38 +08:00 via iPhone
想问问,如果吧 int n=9 去掉,从 main 第一个参数里赋值 int ,还能通过编译么……
|
24
ovear 2017-01-20 14:49:43 +08:00
c99 的新特性哈哈哈, c prime plus 有讲 hhh
|
25
faywong8888 2017-01-20 20:05:59 +08:00 via iPhone
c99 标准特性
|
26
owt5008137 2017-01-21 02:32:21 +08:00 via Android
c99 的变长数组, gcc 支持但是 vc 不支持,现在很多教科书都是基于 vc ( 6 )的
这么搞如果 n 比较大容易爆栈 斐波那契数列可以用矩阵相乘把时间复杂度优化到 O(log(n)) |
27
amet 2017-01-21 10:53:40 +08:00
@diangdiang 似乎用到过, clang 好像是支持的。比较新的主流编译器都可以吧。
|
29
ghSimon 2017-01-21 15:48:31 +08:00
只写 gcc -std=c89 默认不会关闭 gcc 的那些扩展,必须还要再加上-pedantic 表示严格参照 ISO C
|