1. char 类型分为signed char ,unsigned char,具体表示根据编译器决定,因此不要用char类型进行算术运算,除非明确指定类型
2. long 的字节长度不低于int,但部分操作系统中long的表示范围与int一致,因此,如果太大的数值,可以直接用long long表示。如果明确数值大小,尽量使用int32_t,int64_t明确大小。
3.当我们赋给无符号类型一个超过它表示范围的值时,结果是初始值对无符号类型表示数值总和取模后的余数;当我们赋给有符号类型一个超过它表示范围的值是数值时,表示数值为 undfined
#include <iostream>
int main(){
uint8_t c1 = -1;
uint8_t c11 = 257;
unsigned char c2 = -1000;
signed char c3 = 256;
std::cout << "c1: " << int(c1) << " || c11: " << int(c11) << " || C2: " << int(c2) << " || c3: "<< int(c3) << std::endl;
return 0;
}
结果为:c1: 255 || c11: 1 || C2: 24 || c3: 0
无符号的数值为 数值 % 256,需要注意负数取模是向-∞靠近
4. 如果使用初始化列表,且初始值列表存在丢失的风险,那么编译器将报错
5. 如果内置类型的变量未被显示的初始化,它的值由定义的位置决定,定义于任何函数体之外的变量被初始化为0,有一种例外情况,就是定义在函数内部的内置类型将不被初始化,一个未被初始化的内置变量的值是未定义的,试图拷贝或者访问这个变量会发生未定义的行为。
#include <iostream>
class Data_{
public:
int data;
};
void print(){
int print_data;
std::cout << "print_data:" <<print_data << std::endl;
}
int main(){
int data;
Data_ data2;
std::cout << "data:" << data << " || Data.data: " << data2.data <<std::endl;
print();
}
输出结果如下:
data:0 || Data.data: 0
print_data:32715
从实验结果看出,类里面,主函数里面的值进行了默认初始化,但是在函数内的数值就没有初始化,产生了未定义的行为。
6. 如果想要声明一个变量,而非定义一个变量,需要在变量前添加关键字extern。注意,此时函数体内不再允许初始化赋值。
7. 变量仅能被定义一次,但可以被声明多次
8. 默认状态下,const对象仅在文件内有效,也就是内部链接性,仅在定义的源码文件内能够访问,除非添加extern关键字,如下所示
// file.h
extern const int DATA = 1;
// file.cpp
#include file.h
// 声明const变量,能够全局使用
extern const int DATA
9. 试图让一个非常量的引用指向一个常量对象,这是错误的;常量引用有点像是
const int* const p;
另外常量引用,支持字面量初始化
10. 直接修饰的顶层const没有拷贝限制
11. 当你认为变量是一个常量表达式是,使用constexpr声明表示,增加常量检查机制
12. constexpr 在声明中如果定义了一个指针,那么这指针是一个常量指针,也就是说,这个指针指向的数据不能改变。
13.假如 i是int类型的数据,decltype(i=c)返回的数值时int&,这是因为赋值函数返回的是i的引用,避免了数据拷贝;