
这段代码在 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 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 |
10 rogerchen 2017-01-20 11:14:32 +08:00 |
11 saintaugustinus 2017-01-20 11:17:13 +08:00 via iPhone 标准是 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 楼主被谭浩强害了 |
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 谭浩强+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 |