问题1
全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?
答: 这是一个华为的面试题 看似简单 其实考点很多。首先,如果只是这样在头文件中单纯的定义全局变量,int g_var = 0;那么多个C文件包含后肯定会出错,因为#include某个文件的本质其实是“复制”内容到当前文件 因此会造成重复定义的错误~
我下面说一下几种方法的优缺点
有一种做法是 把全局变量声明为static 让其拥有文件作用域 这样做可以消除重复定义的编译错误 但是 这样做 全局变量其实有了多份copy 也就是说 各个文件中的同名全局变量其实是不同的 其包含的值也不同 这个做法是绝对的自找bug型 想加班想疯了 建议不这么做
方法二 extern
在头文件中 为全局变量定义一个宏
#ifndef G_VAR
int g_var = 0;
#else
extern g_var;
#endif
这个做法在功能上能够解决重复定义的编译问题 也能保证 全局变量的唯一性
但是在工程中这个做法给项目维护性带来极大的灾难
因为所有的全局变量分散在不同的头文件中 无人能知究竟整个项目中有多少全局变量
方法三 对方法二进行工程改进
在项目中 专门建立名叫 global_var.h 和 global_var.c 的文件 将所有的全局变量全部定义在 global_var.c 中
在头文件中global_var.h中 只有
extern g_var;
采用方法三后 可以直接搜索 global_var.h 这个字符串 那么所有使用全局变量文件都会搜索出来
通过global_var.c文件可以知道 整个项目中究竟定义了多少全局变量
在C项目中 全局变量使用数目的多少 在一定意义上能反映整个项目的维护性 全局变量使用越多 后期越来维护
第一个题
编写函数判断一个数是否为2的n次幂
bool isPow2(unsigned int x);
bool isPow2(unsigned int x)
{
return !(x & (x - 1));
}
这个想法很简单 如果x为2的n次幂 那么必然的在二进制上 这32位中有且仅有一位为1 x-1必然导致低n-1位由0变为1 两者相与就只有0了,因为函数原型返回值为bool
所以这个就够了 但是如果是求出是2的多少次幂 那么又怎么写呢
我的意思是
实现函数 int nPow2(unsigned int x)
nPow2(4) ==> 2
nPow2(8) ==> 3
nPow2(128) ==> 7
原理简单 看看我的方法
// 返回一个数的2次幂
int nPow2(unsigned int x)
{
int ret = 0xFFFFFFFF;
if( isPow2(x) )
{
ret = 0;
while( x ? (ret++, (x = x >> 1)) : 0 );
ret--;
}
return ret;
}
下一个问题
数组a[N],存放了1至N-1个数,其中某个数重复一次。写一个函数,找出被重复的数字.时间复杂度必须为o(N)函数原型:
int do_dup(int a[],int N);
我得说的是,这个题目是求重复的数,为什么很多同学,都用异或呢》?
int do_dup(int a[],int N) //未经调试
{
int sun = 0;
int i = 0;
for(i=0; i<N; i++)
{
sum += a[i];
}
return sum - ((N - 1) * N / 2);
}
下一题
判断数组a中存储的元素是否对称
bool is_symmetry(int a, int n);
int a[] = {1, 2, 5, 2, 1};
is_symmetry(a, 5); ==> true
int a[] = {1, 2, 5, 2, 3};
is_symmetry(a, 5); ==> false
int is_symmetry(int a[], unsigned int n)
{
return ((n == 0) || (n == 1)) ? 1 : ((a[0] == a[n - 1]) && is_symmetry(a + 2, n - 2));
}