1.分别给出BOOL,int,float,指针于零值进行比较的if语句
BOOL型:if(!var)
int型:if(var==0)
float型:const float tmp=0.00001; if(var>=-tmp && var<=tmp) 浮点型变量并不精确,所以不可以用“==”“!=”与数字进行比较,if(var==0.0)为错误书写方式
指针型:if(var==NULL)
2.一个32位程序,计算sizeof的大小
void func(char str[100])
{
sizeof(str)=?
}
void *p=malloc(100);
sizeof(p)=?
答案是4,4
func(char str[100])函数中,数组名作为函数形参时,在函数体内,数组名失去了本身的内涵,沦为普通指针,失去了常量特性,可以做自增、自减操作。
3.宏的正确写法,把参数都用括号括起来,后面没有分号,不是C语言执行语句
#define min(x,y) ((x)>(y)?(x):(y))
宏只是进行名字替换,不是真正的函数,在参数调用时会产生副作用,在参数自增或自减时也会产生副作用
4.为什么标准头文件中经常有这样的代码?
#ifndef _INCvxWorksh
#define _INCvxWorksh
#ifdef _cplusplus
extern "C" {
#endif
/*...*/
#ifdef _cplusplus
}
#endif
#endif
答:
#ifndef _INCvxWorksh
#define _INCvxWorksh
#endif 是防止被重复引用。
作为面向对象的编程语言,C++支持函数重载,面向过程的C语言不支持,为了实现C和C++的混合编程,提供了extern “C”来解决名字来解决名字匹配问题,函数名称前加上extern “C”,编译器就会按照C语言的编译方式来编译该函数,这样C语言就可以调用C++的函数了。
5.说出static和const尽可能多的应用
static:
修饰局部变量,作用域限于函数体内,生存期为整个程序生命周期;
修饰全局变量,作用域限于该源文件,不能被其他外部文件调用;
修饰函数,作用域限于该源文件,不能被外部文件调用;
const:
定义时需要初始化,一旦定义,不可修改,在内存的常量区存放;
对指针来说,可以指定指针为常量类型,或者其所指向内容为常量,或者两者都为常量;
函数声明时,修饰形参,表明其值不可修改;
6.试写一个C语言函数,若处理器是Big_endian,返回0,若是Little_endian,返回1
#include <stdio.h>
int checkCPU()
{
union{
int a;
char b;
}data;
data.a=1;
return (data.b==1);
}
int main()
{
printf("%d\n",checkCPU());
return 0;
}