C/C++拾遗(四)
运算符问题
int main() { unsigned char a = 0xA5; unsigned char b = ~a>>4+1; printf("b = %d\n",b); return 0; }
这个是面试宝典上的一个题,马上要面试了重新复习下基础知识。
答案是250.
流程是这个样子的:a先进行整形提升变成0x000000A5-------->进行取反0xFFFFFF5A------->由于“+”的优先级高于>>,所以直接右移5位 -----> 0x07FFFFFA ----->截断成1个字节0xFA,即250
这里要注意的是运算符的优先级:特殊符号>单目操作符>双目操作符>三目操作符>赋值操作符>逗号操作符
除了双目操作符是自左向右结合外,其他都是自右向左。双目操作符中的几个优先级:数移关逻
再谈const
在C++中,一个const的类对象,只能调用类内的const方法;类内的const方法不能改变类内的成员变量。但是在成员变量中加入“mutable”,就可以修改了,代码如下:
class C { public: C(int i) : m_Count(i){} int incr()const { return ++m_Count; } int decr()const { return --m_Count; } private: mutable int m_Count; }; int main() { C c1(0), c2(10); for(int tmp, i = 0; i < 10; i++) { tmp = c1.incr(); cout<<setw(tmp)<<setfill(' ')<<tmp<<endl; tmp = c2.decr(); cout<<setw(tmp)<<setfill(' ')<<tmp<<endl; }return 0; }
字节对齐
字节对齐谈过很多遍了,这里再记录一下,主要有两个标准:
- 结构中每个数据成员都小于处理器的位数时,便以结构中最长的元素作为对齐单位,也就是说结构体的长度一定是最长数据元素的整数倍
- 如果结构体内存在长度大于处理器位数的元素,那么就以处理器位数为对齐单位
在VC中,我们可以用pack预处理指令来禁止对齐调整,使得结构更加紧凑,通常用在要直接写入文件或者通过网络传输时节省空间。
http://www.cppblog.com/snailcong/archive/2009/03/16/76705.html
一段程序
class A { public: A(){m_a = 1; m_b = 2;} ~A(){} void fun(){printf("%d%d", m_a, m_b);} private: int m_a; int m_b; }; class B { public: B(){m_c = 3;} ~B(); void fun(){printf("%d", m_c);} private: int m_c; }; int main() { A a; B *pb = (B*)&a; pb->fun(); system("pause"); return 0; }
这里的pb是指向B对象的指针,只影响对方法的查找。