C/C++拾遗(四)

运算符问题

int main()
{
    unsigned char a = 0xA5;
    unsigned char b = ~a>>4+1;
    printf("b = %d
",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对象的指针,只影响对方法的查找。

原文地址:https://www.cnblogs.com/7ants/p/3263533.html