C语言 百文网手机站

标准c语言笔试题

时间:2021-04-16 08:54:52 C语言 我要投稿

标准c语言笔试题

  引导语:在应聘与c语言相关岗位的工作时会要求进行笔试,以下是小编整理的标准c语言笔试题,欢迎参考阅读!

标准c语言笔试题

  1. 局部变量能否和全局变量重名? (华为)

  解析:能,局部会屏蔽全局。要用全局变量,需要使用"::"

  局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量, 而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量. 比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。

  3. 如何引用一个已经定义过的全局变量? (华为)

  解析:extern

  可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中 声明的全局变理,假定你将那个编写错了,那么在编译期间会报错,如果你用extern方式引用时, 假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。

  4. static全局变量与普通的全局变量有什么区别?

  解析:1) 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。 全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式 从以上分析可以看出,

  static全局变量与普通的全局变量有什么区别:

  static全局变量只初使化一次,防止在其他文件单元中被引用; static局部变量和普通局部变量有什么区别:

  static局部变量只被初始化一次,下一次依据上一次结果值; static函数与普通函数有什么区别: static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝

  5. 进程和线程的差别(微软亚洲)

  解析:答:线程是指进程内的一个执行单元,也是进程内的可调度实体. 与进程的区别:

  (1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位

  (2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行

  (3)拥有资源:进程是拥有资源的独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源.

  (4)系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销

  6. 用宏定义写出swap(x,y)(思科)

  解析:#define swap(x, y) x = x + y; y = x - y; x = x - y

  7. 什么是预编译,何时需要预编译:(思科)

  解析:就是指程序执行前的一些预处理工作,主要指#表示的. 何时需要预编译? 1)、总是使用不经常改动的大型代码体。

  2)、程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。 在这种情况下,可以将所有包含文件预编译为一个预编译头。

  8. 下述三个有什么区别?char * const p;char const * p,const char *p; (慧通)

  解:const char* p和char const *p修饰的是p所指向的变量,

  不可以用*p=’a’等这样的方式修改变量区的内容. 指针本身是可以修改的,比如说

  char x,y; const *p = &x, p = &y,修改指针本身是可以的,*p = ‘b’就不行。

  Char *const p;中const修饰的是指针,表明指针在操作过程中不可以修改,

  而指针所指向的内容是可以修改的,比如说char x ,y; char* const p = &x; *p = ‘b’是可以的, 但p=&y;是不可以的,const修饰的是指针,不可以修改指针的指向,

  只可以修改指针所捆绑的变量

  9. int (*s[10])(int) 表示的是什么啊 ? (慧通)

  解析:这样的表达式可以遵循这样的规则:从右向左,由近及远,括号优先;

  比如:从a符号开始。其右边是[10],说明a是个数组,其中存了十个元素。 再看a的左边是一个*。说明数组中存的是指针。 现在在看(*a[10])的右边是(int);说明所存的指针是指向有一个int形参的函数 现在看(*a[10])的左边是个int ,说明指向的函数的返回值为int 类型;

  10. 进程之间通信的途径,进程间通信方法(慧通)

  解析:无名管道,命名管道,消息队列,信号,共享内存,套接字。等

  11. 什么是“引用”?申明和使用“引用”要注意哪些问题?

  解析:引用就是某个目标变量的“别名”(alias),对应用的操作与对变量直接操作效果完全相同。申明一个引用的时候,切记要对其进行初始化。引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,不能再把该引用名作为其他变量名的别名。声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。不能建立数组的引用

  12.include和include “filename.h”的区别?

  解析:<>是从标准库路径搜索,

  “”是从用户当前工作目录开始,找不到,在到标准库开始

  13.Heap和Stack的区别?

  解析:Heap是堆,Stack是栈。

  栈的空间由操作系统自动分配和回收,而堆上的空间由程序员申请和释放。

  栈的空间大小较小,而堆的空间较大。

  栈的地址空间往低地址方向生长,而堆向高地址方向生长。

  栈的存取效率更高。

  程序在编译期间对变量和函数的内存分配都在栈上,

  且程序运行过程中对函数调用中参数的内存分配也是在栈上。

  14.sizeof和strlen之间的区别?

  解析:(1)sizeof操作符的结果类型是size_t,它在头文件中的typedef为

  unsigned int类型,该类型保证能容纳实现所建立的最大对象的字节大小。

  (2)sizeof是运算符,strlen是函数

  (3)sizeof可以用类型做参数,strlen只能用char *做参数,

  且必须是以’’结尾的。

  (4)数组做sizeof的参数不退化,传递给strlen就退化为指针。

  (5)大部分编译程序在编译的时候就把sizeof计算过了

  是类型或是变量的长度。

  (6)strlen的结果要在运行的时候才能计算出来,用来计算字符串的长度,

  而不是类型占用内存的大小。

  (7)sizeof后如果是类型必须加括号,如果是变量名可以不加括号。

  (8)当使用了一个结构类型或变量时,sizeof返回实际的大小。

  (9)数组作为参数传递给函数时传的`是指针而不是数组,

  传递的是数组的首地址。

  (10)计算结构变量的大小就必须讨论数组对齐问题。

  (11)sizeof操作符不能用于函数类型,不完全类型或位字段。

  15.#define DOUBLE(x) x+x ,i = 5*DOUBLE(5); i 是多少?

  解析:i 为30。

  16.unsigned short hash(unsigned short key) { return (key>>)%256 }

  解析 请问hash(16),hash(256)的值分别是: A.1.16;B.8.32;C.4.16;D.1.32

  17.bool double int float.各种类型与0值的比较(概率较大)

  解析:请写出 BOOL flag 与“零值”比较的 if 语句。if ( flag ) 或者 if ( !flag )

  如下写法均属不良风格,不得分。 if (flag == TRUE)

  if (flag == 1 ) if (flag == FALSE) if (flag == 0)

  请写出 float x 与“零值”比较的 if 语句。(4分) 标准答案示例:

  const float EPSINON = 0.00001;

  if ((x >= - EPSINON) && (x <= EPSINON)

  不可将浮点变量用“==”或“!=”与数字比较,

  应该设法转化成“>=”或“<=”此类形式

  如下是错误的写法,不得分。 if (x == 0.0) if (x != 0.0)

  请写出 char *p 与“零值”比较的 if 语句。(3分) 标准答案:

  if (p == NULL) 或者 if (p != NULL)

  如下写法均属不良风格,不得分。 if (p == 0) if (p != 0) if (p) if (!)

  18.结构与联合有和区别?

  解析:

  1. 结构和联合都是由多个不同的数据类型成员组成, 但在任何同一时刻, 联合中只存放了一个被选中 的成员(所有成员共用一块地址空间), 而结构的所有成员都存在(不同成员的存放地址不同)。

  2. 对于联合的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存在了,

  而对于结构的不同成员赋值是互不影响的

  19.简述数组与指针的区别?

  解析:数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。

  指针可以随时指向任意类型的内存块。

  (1)修改内容上的差别

  char a[] = “hello”; a[0] = ‘X’;

  char *p = “world”; // 注意p 指向常量字符串

  p[0] = ‘X’; // 编译器不能发现该错误,运行时错误

  (2) 用运算符sizeof 可以计算出数组的容量(字节数)。

  sizeof(p),p 为指针得到的是一个指针变量的字节数,而不是p 所指的内存容量。

  C++/C 语言没有办法知道指针所指的内存容量,除非在申请内存时记住它。

  注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。

  char a[] = "hello world"; char *p = a; cout<< sizeof(a) << endl; // 12 字节

  cout<< sizeof(p) << endl; // 4 字节 计算数组和指针的内存容量

  void Func(char a[100]) { cout<< sizeof(a) << endl; // 4 字节不是100 字节 }

  20.如何判断一段程序是由C 编译程序还是由C++编译程序编译的?

  解析:#ifdef __cplusplus cout<<"c++"; #else cout<<"c"; #endif

  21.main 主函数执行完毕后,是否可能会再执行一段代码,给出说明?

  解析:可以,可以用_onexit 注册一个函数,它会在main 之后执行

  int fn1(void), fn2(void), fn3(void), fn4 (void); void main( void ) {

  String str("zhanglin"); _onexit( fn1 ); _onexit( fn2 ); _onexit( fn3 ); _onexit( fn4 );

  printf( "This is executed first. " ); }

  int fn1() { printf( "next. " );return 0; }

  int fn2(){printf( "executed " ); return 0; }

  int fn3() { printf( "is " ); return 0; }

  int fn4() { printf( "This " ); return 0; }

  22.int id[sizeof(unsigned long)]; 这个对吗?为什么??

  解析:对,这个 sizeof是编译时运算符,编译时就确定了可以看成和机器有关的常量。

  23.如何打印出当前源文件的文件名以及源文件的当前行号?

  解析: cout << __FILE__ ; cout<<__LINE__ ; __FILE__和__LINE__是系统预定义宏,这种宏并不是在某个文件中定义的

  而是由编译器定义的

  解析:不能,数组作为参数传递给函数时,数组名被退化为指针,

  因此函数中的sizeof(str)实际是在求一个指针的sizeof,答案为4,

  因此不能计算出数组的长度。

  24.以下函数能求出数组的长度吗?void fun(char str[]){ int len = sizeof(str)/sizeof(str[0]);}

  25. 输出的结果是多少,并分析过程?

  unsigned short A = 10;

  printf(“%u ”, ~A);

  char ch = 128;

  printf(“%d ”, ch);

  答:~A=4294967285,首先将A转化为int类型,即对应的二进制数值为: 00000000 00000000 00000000 00001010,

  ~A=11111111 11111111 11111111 11110101,

  其实这种情况最高位是1,认为是负数,但是在输出中指定以无符号数输出, 于是结果为4294967285=4294967295(四字节表示的最大数)-10.

  ch = 128对应的二进制为:10000000,在输出中以整数形式输出,由于最高位是1, 于是就是负数,10000000是该负数的补码,根据求补码的反步骤计算,先-1, 得到01111111,在取反得10000000=128,由于本身是负数,即为-128.

  26. New 与malloc free 的联系与区别?

  解析:都是在堆(heap)上进行动态的内存操作。用malloc函数需要指定内存分配的字

  节数并且不能初始化对象,new 会自动调用对象的构造函数。 会调用对象的 destructor,而free 不会调用对象的destructor.

  27.用变量a给出下面的定义 (特别重要)

  a) 一个整型数(An integer) b) 一个指向整型数的指针(A pointer to an integer)

  c) 一个指向指针的的指针,它指向的指针是指向一个整型数(A pointer to a pointer to an integer) d) 一个有10个整型数的数组(An array of 10 integers)

  e) 一个有10个指针的数组,该指针是指向一个整型数的(An array of 10 pointers to integers) f) 一个指向有10个整型数数组的指针(A pointer to an array of 10 integers)

  g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数

  解析:a) int a; // An integer

  b) int *a; // A pointer to an integer

  c) int **a; // A pointer to a pointer to an integer d) int a[10]; // An array of 10 integers

  e) int *a[10]; // An array of 10 pointers to integers

  f) int (*a)[10]; // A pointer to an array of 10 integers

  g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer h) int (*a[10])(int);

  28.在不用第三方参数的情况下,交换两个参数的值

  解析:方法1:#includevoid main(){

  int i=60; int j=50; i=i+j; j=i-j; i=i-j;

  printf("i=%d/n",i); printf("j=%d/n",j);}

  方法二:

  i^=j;

  j^=i;

  i^=j;、

【标准c语言笔试题】相关文章:

C语言试题(精选)10-08

C语言试题大全10-08

C语言试题训练10-08

c语言经典笔试题10-08

C语言面试笔试题02-11

C语言练习测试试题10-08

c语言常见笔试题总结10-08

C语言自我检测试题10-08

C语言自测试题10-08