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表示数据类型
<p>#define FIND(struc,e) (unsigned int)&(((struc*)0)->e)//为了便于不同系统之间移植,最好定义一种无符号型数据,一般为unsigned int。</p>
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除尽。