C++ 教程 在线

1869C++ 运算符

& :只有2个都为1,那么结果是1,否则为0;例如:1&1=1,1&0=0,0&0=0,0&1=0;

11 & 3 = 3

   00001011
&  00000011
=  00000011 = 3

| :只要有一个是1,那么结果为1,否则为0;例如:1&1=1,1&0=1,0&0=0,0&1=1;

11 | 3 = 11

   00001011
|  00000011
=  00001011 = 11

>> :向右位移,就是把尾数去掉位数,例如:153 >> 2,153的二进制是:10011001,屁股后面去掉 2 位 100110,100110 转化成十进制就是 38,153 = 10011001,38 =100110,"01" 去掉了。

<< :向左位移,就是把开头两位数去掉,尾数加位数00,例如:

107 = 0110 1011 <<2
<<
172 = 1010 1100

在计算机中由于是32位的

107 = 0000 0000   0000 0000   0000 0000   0110 1011 <<2
<<
428 = 0000 0000   0000 0000   0000 0001   1010 1100

^ :两个相同的数会变成0,反之是1,例如:1&1=0,1&0=1,0&0=0,0&1=1;

11^3 = 8

   00001011
^  00000011
=  00001000 = 8

1868C++ 存储类

在一个类里建立一个 const 时,不能给他初值:

class foo{
public:
    foo():i(100){}
private:
    const int i=100; // 错误!!!
};
//或者通过这样的方式来进行初始化
foo::foo():i(100){}
更多查看文章:C++ static、const 和 static const 类型成员变量声明以及初始化

1867C++ 存储类

在局部变量前加上“static”关键字,就成了静态局部变量。静态局部变量存放在内存的全局数据区。函数结束时,静态局部变量不会消失,每次该函数调用 时,也不会为其重新分配空间。它始终驻留在全局数据区,直到程序运行结束。静态局部变量的初始化与全局变量类似.如果不为其显式初始化,则C++自动为其 初始化为0。

静态局部变量与全局变量共享全局数据区,但静态局部变量只在定义它的函数中可见。静态局部变量与局部变量在存储位置上不同,使得其存在的时限也不同,导致对这两者操作 的运行结果也不同。

1866C++ 存储类

1、寄存器存在于CPU中,速度很快,数目有限

存储器就是内存,速度稍慢,但数量很大。

计算机做运算时,必须将数据读入寄存器才能运算。

2、存储器包括寄存器,存储器有 ROM 和 RAM

1865C++ 存储类

如何解决 g++ 不支持 auto 自动数据类型?

在编写 Lambda 表达式的时候,发现 gcc 似乎不支持 auto 类型。

源代码 test.cpp 如下:

#include <iostream>
using namespace std;
int main() {
        auto basicLambda = [] { cout << "Hello, world!" << endl; };
        basicLambda();
        return 0;
}

编译报错:

$ g++ test.cpp -o test
test.cpp: In function ‘int main()’:
test.cpp:6:7: error: ‘basicLambda’ does not name a type
  auto basicLambda = [] { cout << "Hello, world!" << endl; };
       ^
test.cpp:7:14: error: ‘basicLambda’ was not declared in this scope
  basicLambda();
              ^

经过查询,发现 gcc 是 4.8.4 版本,应该是默认不开启,但是可以通过添加编译参数 -std=c++11 解决问题,

$ g++ test.cpp --std=c++11 -o test
$ ./test
Hello, world!