请问一个 C 语言程序从源代码到可执行文件中间会进行哪些过程,你能简单描述一下每个环节都做了什么事情吗?
1、预处理
在预处理阶段,编译器主要作加载头文件、宏替换、条件编译的作用。一般处理带“#”的语句。
2、编译
在编译过程中,编译器主要作语法检查和词法分析。我们可以通过使用 -S 选项来进行查看,该选项预处理之后的结果翻译成汇编代码。
3、汇编
在汇编过程中,编译器把汇编代码转化为机器代码。
4、链接
链接就是将目标文件、启动代码、库文件链接成可执行文件的过程,这个文件可被加载或拷贝到存储器执行。
请解释一下这行代码做了什么?
puts((char *)(int const[]){ 0X6F796958, 0X6E694C75, 0X72477875, 0X3270756F, 0X313230, 0X00000A});
定义了一个新数组const,并初始化。之后强制类型转换为char类型指针,其内容被作为char类型输出了出来。
请随机输入一串字符串,你能解释一下输出结果吗?
int main(int argc, char *argv[]) { char str[1121]; int key; char t; fgets(str, 1121, stdin); for (int i = 0; i < strlen(str) - 1; i++) { key = i; for (int j = i + 1; j < strlen(str); j++) { if (str[key] > str[j]) { key = j; } } t = str[key]; str[key] = str[i]; str[i] = t; } puts(str); return 0; }
通过冒泡排序实现对字符的排序。其中使用fgets来读取用户的输入。
用循环和递归求 Fibonacci 数列,你觉得这两种方式那种更好?说说你的看法。如果让你求 Fibonacci 数列的第 100 项,你觉得还可以用常规的方法求解吗?请试着求出前 100 项的值(tip 大数运算)。
递归代码简洁,但时间复杂度高。循环代码较递归繁琐,但耗时短。
使用大数加法实现斐波那契数列
#include <stdio.h> #include <string.h> int a[1005][1005]; int main() { int T; scanf("%d",&T); while(T--) { int n; scanf("%d",&n); int c; int d=0; memset(a,0,sizeof(a)); a[1][0]=1;a[2][0]=1; for(int i=3;i<=n;i++) { c=0; for(int j=0;j<=d;j++) { a[i][j]=a[i-1][j]+a[i-2][j]+c; c=a[i][j]/10; a[i][j]%=10; } while(c!=0) { a[i][++d]=c%10; c/=10; } } for(int i=d;i>=0;i--) { printf("%d",a[n][i]); } printf("\n"); } return 0; }