C语言简答题含有部分我们阶段测试的题目(一)

1 、用预处理指令 #define 申明一个常数,用以表明 1 年中有多少秒(忽略闰年问题);写一个“标准 #define ”宏 MIN 函数,这个宏输入两个参数并返回最小的一个。

答:
(1)
#define    SECONDS_PER_YEAR    (60*60*24*365)        
(2)  
#define MIN(A,B) ((A) <= (B) ? (A) : (B))

                MIN(*p++, b)会产生宏的副作用
     剖析:
         这个面试题主要考查面试者对宏定义的使用,宏定义可以实现类似于函数的功能,但是它终归不是函数,而宏    定义中括弧中的“参数”也不是真的参数,在宏展开的时候对“参数”进行的是一对一的替换。程序员对宏定义的使用要非常小心,特别要注意两个问题:
(1) 谨慎地将宏定义中的“参数”和整个宏用用括弧括起来。所以,严格地讲,下述解答:
#define MIN(A,B) (A) <= (B) ? (A) : (B)
#define MIN(A,B) (A <= B ? A : B )都应判0分;

(2) 防止宏的副作用。
  宏定义#define MIN(A,B) ((A) <= (B) ? (A) : (B))对MIN(*p++, b)的作用结果是:((*p++) <= (b) ? (*p++) : (*p++)) 这个表达式会产生副作用,指针p会作三次++自增操作。除此之外,另一个应该判0分的解答是:
#define MIN(A,B) ((A) <= (B) ? (A) : (B));

这个解答在宏定义的后面加“;”,显示编写者对宏的概念模糊不清,只能被无情地判0分并被面试官淘汰。
2
、用变量 a 给出下面的定义

a)一个整型数。           

答: int a;

b)一个指向整型数的指针。

 答:int *a;

c)一个指向指针的指针,它指向的指针是指向一个整型数。

 答:int **a;

d)一个有10个整型数的数组

答:int a[10];

e)一个有10个指针的数组,该指针是指向一个整型数的。

 答:int *a[10];

f)一个指向有10个整型数组的指针。

 答:int (*a) [10];

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

 答:int *a(int);

h)一个有10个指针的数组,该指针是指向一个函数,该函数一个整型参数并返回一个整型数。

 答:int (*a[10])(int);


3
、关键字volatile有什么含义?并给出三个不同的例子。

答:一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确的说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。

例:(1)并行设备的硬件寄存器(如:状态寄存器)

2)一个中断服务子程序中会访问到的非自动变量

3)多线程应用中被几个任务共享的变量


4
、结构与联合有何区别?

答:
①结构和联合都是由多个不同的数据类型成员组成,但在任何同一时刻,联合中只存放了一个被选中的成员(所有成员共用一块地址空间),而结构的所有成员都存在(不同成员的存放地址不同)。
②对于联合的不同成员赋值,将会对其他成员重写,原来成员的只就不存在了,而对于结构的不同成员赋值是互不影响的。


5
、求下面函数的返回值(微软)

   int func(x)

   {

       int countx = 0;

       while(x)

       {

            countx ++;

            x = x&(x-1);

       }

       return countx;

   }

答:假定x=9999,答案是8
 
剖析:
       
x = 9999 时,x-1=9998,用二进制表示

      10011100001111
      10011100001110
      当他们执行&运算并赋值给x,结果x为
      10011100001110
      此时x-1为
      10011100001101
      当他们执行&运算并赋值给x,结果x为
      10011100001100
      如此类推到结果为00000000000000,应该发现x = x&(x-1)就是将x最右边的二进制位1变为0。x为9999时二进制为1的位有8个,所以结果为8


6
、数组与指针的区别?

答:
首先对于编译器而言,一个数组是一个地址,一个指针是一个地址的地址。

数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变。指针可以随时指向任意类型的内
存块,远比数组灵活,但也更危险。

   1、指针和数组都可以在初始化的时候赋予字符串常量。尽管看上去一样,底层机制却不同。  

   指针在定义的时候,编译器并不会为指针所指向的对象分配内存空间,它只是分配指针变量的空间。除非以一个字符串常量对其进行初始化。下面的定义创建了一个字符串常量(为其分配了内存空间)  

   char *p = "abcd";  

   在ANSI C中,初始化指针时所指向的字符串被定义为只读,如果想通过指针修改字符串的时候,会产生未定义的行为。  

   数组也可以用字符串常量进行初始化,但是其内容可以被修改。  


2、内容的复制和比较  

   不能对数组进行字节复制和比较,对于两个数组a,b,不能用b=a进行复制,而应当使用标准库函数strcpy()。也不能使用if(b==a)进行比较,应当使用strcmp()。  

   而对于指针p,如果要想将数组a中的内容复制,要先申请一块内存区域,然后使用strcpy()进行拷贝。 

 

    3、计算内存容量  

    用运算符sizeof()可以计算出数组的容量(字节数)。而指针sizeof()的结果为4

    注意当数组名作为函数参数进行传递时,该数组自动退化该类型的指针
 老师给过一本书 叫
《C专家编程》里面的第四章详细讲解了指针与数组的区别

7、移位操作为何最好使用无符号数?

答:
因为在
C语言标准中,只规定了无符号数的移位操作是采用逻辑移位(即左移、右移都是使用的逻辑左移和逻辑右移)。而对于有符号数其左移操作是采用逻辑左移,但右移操作是采用逻辑右移还是算数右移就取决于机器了。(算术右移和逻辑右移的区别是:算术右移不右移符号位,即最高位,右移后前补0还是1取决于符号位的值;逻辑右移执行时将移动符号位,右移后前补0),因此,如果使用了有符号数的右移位操作,它就是不可移植的了。


8
、关键字static的作用是什么?

答:
   
全局静态变量:作用范围局限于它的源文件,即只有本文件内的代码才可以访问它,变量名在其他文件  内不可见

   局部静态变量:局限于特定函数,但出作用域并不释放,在函数体内的静态变量的值也能够维持

   静态函数:作用范围仅限于它的源文件,即只有本文件内才能够调用,函数名在其他文件不可见

   存放位置:程序开始时,存放在全局数据区,结束时释放空间,默认初始化值是0,使用时可改变其值


9#include<file.h>#includefile.h”的区别?

答:
   
#include<file.h>是用于包含C标准头文件,编译器从标准库路径开始搜索file.h

#includefile.h 是用于你自定义的头文件,编译器从用户的工作路径开始搜索file.h


10
、下面const的含义如何?

const int *a;          

int const *a;          

int *const a;          

int const *const a;     
 
答:
   
const int a; int const a; 这两个写法是等同的,表示a是一个int常量

      const int *a; 表示a是一个指针,可以任意指向int常量或者int变量,它总是把它所指向的目标当作一个int常量。也可以写成int const* a ;含义相同。
       int * const a;    表示a是一个指针常量,初始化的时候必须固定指向一个int变量,之后就不能再指向别的地方了。
       int const * const a; 表示a是一个指针常量,初始化的时候必须固定指向一个int常量或者int变量,之后就不能再指向别的地方了,它总是把它所指向的目标当作一个int常量。也可以写成const int* const a;含义相同。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值