C90中如何声明long long int数组?编译报错解决方案咨询
在C90环境下使用64位整数数组的解决方案
你遇到的问题本质是C90标准并没有定义long long int类型——这个64位整数类型是C99才正式加入标准的,所以严格遵循C90的编译器会直接报错。下面给你两种可行的解决思路,以及修正你代码里的其他小问题:
方案1:利用编译器的扩展支持(最简单)
很多主流编译器(比如GCC、Clang)在C90模式下其实支持long long作为非标准扩展,只是会抛出警告。你只需要在编译时添加对应的选项来允许这个扩展:
- 对于GCC/Clang:编译命令加上
-std=c90 -Wno-long-long-std=c90指定遵循C90标准-Wno-long-long关闭long long相关的警告
用这个方案的话,你只需要修正代码里的两个输入错误(scanf的参数需要传地址),修改后的代码如下:
#include<stdio.h> int main() { int i, n, j, X; long long int N[60]; N[0] = 0; N[1] = 1; for(i = 2; i < 61; i++) { N[i] = N[i-1] + N[i-2]; } scanf("%d", &n); // 修正:添加&取地址 for(j = 0; j < n; j++) { scanf("%d", &X); // 修正:添加&取地址 printf("Fib(%d) = %lld\n", X, N[X]); // 建议加换行,输出更清晰 } return 0; }
方案2:严格遵循C90标准(无扩展)
如果你的环境必须严格符合C90,不能用任何编译器扩展,那需要自己模拟64位整数的实现,因为C90里最大的标准整数类型是long(通常是32位,部分系统可能是64位,但不保证)。
可以用结构体来拆分64位整数为高32位和低32位,然后手动实现加法逻辑:
#include<stdio.h> // 模拟64位整数:高32位+低32位 typedef struct { unsigned int low; unsigned int high; } Int64; // 实现两个Int64的加法 Int64 add(Int64 a, Int64 b) { Int64 result; result.low = a.low + b.low; // 处理进位:如果low相加后溢出,high加1 result.high = a.high + b.high + (result.low < a.low ? 1 : 0); return result; } // 打印Int64类型的数值 void printInt64(Int64 num) { if(num.high != 0) { printf("%u%08u", num.high, num.low); } else { printf("%u", num.low); } } int main() { int i, n, j, X; Int64 N[60]; // 初始化Fib(0)和Fib(1) N[0].low = 0; N[0].high = 0; N[1].low = 1; N[1].high = 0; for(i = 2; i < 61; i++) { N[i] = add(N[i-1], N[i-2]); } scanf("%d", &n); for(j = 0; j < n; j++) { scanf("%d", &X); printf("Fib(%d) = ", X); printInt64(N[X]); printf("\n"); } return 0; }
这个方案完全符合C90标准,不需要依赖任何扩展,能在严格的C90编译器上编译通过。
最后提醒一下:你的原始代码里scanf("%d", n);和scanf("%d", X);是错误的,scanf需要传入变量的地址(用&运算符),不管用哪种方案都必须修正这个问题,否则会导致运行时崩溃或者错误的输入。
内容的提问来源于stack exchange,提问作者Noushad Bhuiyan
相关产品推荐
相关产品推荐

