Huge Lemon的博客

复试笔试C语言重要简答题

2020-01-25

来源:UESTC考研群

从C语言执行效率方便,简述下C语言采取了哪些措施提高执行效率。

  • 使用指针:有些程序用其他语言也可以实现,但C能够更有效地实现;有些程序无法用其它语言实现,如直接访问硬件,但C却可以。正因为指针可以拥有类似于汇编的寻址方式,所以可以使程序更高效。

  • 使用宏函数:宏函数仅仅作为预先写好的代码嵌入到当前程序,不会产生函数调用,所以仅仅是占用了空间,而使程序可以高效运行。在频繁调用同⼀个宏函数的时候,该现象尤其突出。函数和宏函数的区别就在于,宏函数占用了大量的空间,而函数占用了时间。

    • 宏函数的例子:
      1
      2
      3
      4
      5
      6
      7
      #include <stdio.h>
      #define MAX(a,b) (a > b ? a : b)
      int main() {
      int maxNum = MAX(5, 6);
      printf("The max num is : %d\n", maxNum);
      return 0;
      }
  • 使用位操作:位操作可以减少除法和取模的运算。在计算机程序中数据的位是可以操作的最小数据单位,理论上可以用“位运算”来完成所有的运算和操作。灵活的位操作可以有效地提高程序运行的效率。

  • 循环嵌套中将较循环设为内置循环,较循环设为外置循环,以减少cpu跨切循环层的次数,提高程序的运行效率。(操作系统页面置换相关,减少页面置换次数)

  • 将汇编指令嵌入到C语言程序中,汇编语言是效率最高的计算机语言,因此为了获得程序的高效率,可以在C语言程序中嵌入汇编,从而充分利用高级语言和汇编语言各⾃的特点。

  • 在C语言程序中可以调用系统API,接近底层,从而提高程序的运行效率。

  • ⼀般情况下,C语言源程序中的每⼀行代码都要参加编译。但有时候出于对程序代码优化的考虑,希望只对其中⼀部分内容进行编译,此时就需要在程序中加上条件,让编译器只对满足条件的代码进行编译,将不满足条件的代码舍弃,这就是条件编译

请简述C语言的隐式类型转换发生的四种情况,并说明每种情况如何转换。(注:这里面还有个小题,float如何四舍五入转化成int)

  • 算术运算式中,低类型能够转换为高类型(自动类型转换)。
  • 赋值表达式中,右边表达式的值⾃动隐式转换为左边变量的类型,并赋值给它。
  • 函数调用中参数传递时,系统隐式地将实参转换为形参的类型后,赋给形参。
  • 函数有返回值时,系统将隐式地将返回表达式类型转换为返回值类型,赋给调用函数。

小题:float如何四舍五入转化成int

1
2
3
4
5
6
7
#include <stdio.h>
int main() {
float f = 0.5;
int i = (int)(f + 0.5);
printf("%d\n", i);
return 0;
}

数组越界会产生什么后果?

越界访问有可能把数据放到已经存储了重要数据的内存单元,也就是改写了本来不许改写的数据,如果这个数据是系统的重要数据,有可能导致系统运行紊乱甚至是崩溃。当然如果这个数据并不重要,那么越界访问的后果就不明显或者是没有影响。避免的方法是对数组的下标严格检测,判断组数下标是否越界,用指针访问数组时要注意判断指针的指向是否已超过数组下标的最大值

值传递和地址传递

值传递

被调函数的形参作为被调函数的局部变量处理,即在内存的堆栈中开辟空间以存放由主调函数放进来的实参的值,从而成为了实参的一个拷贝
其特点是被调函数对形参的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。

地址传递

被调函数的形参虽然也作为局部变量在堆栈中开辟了内存空间,但是这是存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过堆栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。

C语言中,常量存储在哪里?静态局部变量和静态全局变量存储在哪里?

类型 存储位置
常量 常量区
静态局部变量 全局数据区
静态局部变量 全局数据区
使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏