程序猿面试宝典(第三版)——程序设计基本概念--我应学习

P31--把x转化为二进制后包含1的个数:

int func(int x)
{
  int  c=0;
  while(x)
  {
    c++;
    x=x&(x-1);
  }
  return c;
}

P32--指针语句:*(ptr++)+=123应为:

*ptr=*ptr+123;
ptr++;

P34--boolalpha,函数名称,功能是把bool值显示为true或者false。

P39--判断一个数X是否是2的N次方,不用循环语句,用表达式。

!(X&(X-1))为真时,则X是2的N次方。

P39--x&y是取x和y的相同位的一半。x|y是取x和y的不同位。z>>1是z右移一位相当于z除以2。

P40--找出两个数中间比较大的那个数,(不用“if”,“?:”,“switch”或其他判断语句)

int max=((a+b)+abs(a-b))/2;
P40--交换a、b的值,不使用中间变量。

a=a+b;b=a-b;a=a-b;//如果a、b都是比较大的两个数,a=a+b时就会超界

a=a^b;b=a^b;a=a^b;//无需担心超界的问题

P45--用一个宏定义FIND求一个结构体struc里某个变量相对struc的偏移量。

#define FIND(struc,e) (size_t)&(((struc*)0)->e) //size_t表示数据类型

#define FIND(struc,e) (unsigned int)&(((struc*)0)->e)//为了便于不同系统之间移植,最好定义一种无符号型数据,一般为unsigned int。

P46--用预处理指令#define声明一个常数,用以表明1年中有多少秒(忽略闰年问题)

#define  SECONDS_PER_YEAR  (60*60*24*365)UL //UL表示无符号长整型

这种写法在编译的时候通不过,这样定义行吗。然后我把 UL去掉就OK了,这是怎么回事?

P46--写一个标准宏MIN,这个宏输入两个参数并返回较小的一个。

#define MIN(A,B) ((A)<=(B)?(A):(B)) //注意使用括号
P46--const有什么用途?

可以定义const常量。

const可以修饰函数的参数和返回值,甚至函数的定义体。

被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。

P47--const与#define相比有什么不同?

const常量有数据类型,宏常量没有数据类型。

编译器对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换中可能会产生意料不到的错误(边际效应)。

有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。在c++程序中只使用const常量而不使用宏常量,即const常量完全取代宏常量。

P48--mutalbe关键字,中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词。

在C++中,mutable也是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。

P49--结构体的长度一定是最长的数据元素的整数倍。

(计算机底层机制的理解和设计程序的原则)

P50--数据对齐,是指数据所在的内存地址必须是该数据长度的整数倍。DWORD数据的内存起始地址能被4除尽,WORD数据的内存起始地址能被2除尽。














你可能感兴趣的:(程序员面试宝典)