问答题(寒假作业1)

1.C语言的缺点
<1>在浮点数的判断大小上,有些小数因为二进制的转换导致不能准确地储存正确的值,这时就可能存在判断结果出错。这时候就需要我们认为地设置一个精度来判断,如果两数之差的绝对值处于精度之外的话,我们可以看作两数相等。类似的例子出现在C语言DS的二分法求解一元四次方程中。
<2>while因为数值范围所造成的死循环。类似的比如char的取值范围为 -128127,while(c<151)所造成的死循环;int i=0;while (i<100){i–;},这是一个伪死循环,int的取值范围为 -21474836482147483647,当i自减至 -2147483648时,再自减会变为2147483647,循环结束。类似的还有自然数溢出的问题。
<3>数组无法正常发挥作用。比如说 int arr[100000]需要在主函数外的全局开设以及数组越界无法正常识别。
<4>C语言是面向过程编程。面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。例如五子棋,面向过程的设计思路就是首先分析问题的步骤:1、开始游戏,2、黑子先走,3、绘制画面,4、判断输赢,5、轮到白子,6、绘制画面,7、判断输赢,8、返回步骤2,9、输出最后结果。把上面每个步骤用不同的方法来实现,因此对于拓展性方面,C语言较弱。
2.C语言/C++的编译过程
1.预处理(Preprocessing),
2.编译(Compilation),
3.汇编(Assemble),
4.链接(Linking)。
1.预处理(Preprocessing)
预处理用于将所有的#include头文件以及宏定义替换成其真正的内容,预处理之后得到的仍然是文本文件,但文件体积会大很多。gcc的预处理是预处理器cpp来完成的,你可以通过如下命令对test.c
进行预处理:
gcc -E -I./inc test.c -o test.i
或者直接调用cpp命令
cpp test.c -I./inc -o test.i
上述命令中-E是让编译器在预处理之后就退出,不进行后续编译过程;-I指定头文件目录,这里指定的是我们自定义的头文件目录;-o指定输出文件名。
经过预处理之后代码体积会大很多:
X
文件名
文件大小
代码行数
预处理前
test.c
146B
9
预处理后
test.i
17691B
857
预处理之后的程序还是文本,可以用文本编辑器打开。
2.编译(Compilation)
这里的编译不是指程序从源文件到二进制程序的全部过程,而是指将经过预处理之后的程序转换成特定汇编代码(assembly code)的过程。编译的指定如下:
gcc -S -I./inc test.c -o test.s
上述命令中-S让编译器在编译之后停止,不进行后续过程。编译过程完成后,将生成程序的汇编代码test.s,这也是文本文件,内容如下:
// test.c汇编之后的结果test.s
.file "test.c"
.section .rodata
.LC0:
.string "a=%d, b=%d, a+b=%d\n"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushl %ebp
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
movl %esp, %ebp
.cfi_def_cfa_register 5
andl $-16, %esp
subl $32, %esp
movl $2, 20(%esp)
movl $3, 24(%esp)
movl 24(%esp), %eax
movl %eax, 4(%esp)
movl 20(%esp), %eax
movl %eax, (%esp)
call add
movl %eax, 28(%esp)
movl 28(%esp), %eax
movl %eax, 12(%esp)
movl 24(%esp), %eax
movl %eax, 8(%esp)
movl 20(%esp), %eax
movl %eax, 4(%esp)
movl $.LC0, (%esp)
call printf
leave
.cfi_restore 5
.cfi_def_cfa 4, 4
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Ubuntu 4.8.2-19ubuntu1) 4.8.2"
.section .note.GNU-stack,"",@progbits
3.汇编(Assemble)
汇编过程将上一步的汇编代码转换成机器码(machine code),这一步产生的文件叫做目标文件,是二进制格式。gcc汇编过程通过as命令完成:
as test.s -o test.o
等价于:
gcc -c test.s -o test.o
这一步会为每一个源文件产生一个目标文件。因此mymath.c也需要产生一个mymath.o文件
4.链接(Linking)
链接过程将多个目标文以及所需的库文件(.so等)链接成最终的可执行文件(executable file)。
命令大致如下:
ld -o test.out test.o inc/mymath.o ...libraries...
参考资料:https://www.cnblogs.com/CarpenterLee/p/5994681.html#top

猜你喜欢

转载自www.cnblogs.com/GuoHail/p/12233590.html