64位操作系统:
bool 8位/1字节
char 8位
short 16位
int 32位
long 32位
float 32位
double 64位
除布尔与字节外整型默认为带符号类型,可以表示正、负、0,添加unsigned为无符号类型,表示大于等于0的值。
当一个表达式中既有无符号数,又有int值时,int值会转换成无符号数。
(原码:第一位为符号位,其余位表示数值,如-1的原码:1,000…0001(两个1之间32个0)。
反码:正数的补码就是其原码;负数的反码为符号位不变,数值位按位取反。如-1的补码为1,111…1110。
补码:正数的补码就是其原码。负数的补码为=反码+1。因此,-1的补码为1,111…111。)
列表初始化
int a = 0;
int a = {0};
int a{0};
int a(0);
花括号在c+11中得到全面应用,当初始化切初始值存在丢失风险时,花括号定义会报错,其余两种转换正确,且确实丢失了部分值。
如果想声明一个变量而非定义,在变量名前添加关键字extern,且不要显示初始化变量。任何包含显示初始化定义的声明即为定义。
变量只能被定义一次,可被声明多次。变量的定义必须且只能出现在一个文件中,而其他用到该变量的文件必须对其进行声明。
指针与引用的不同:
1、指针本身位一个对象,允许对指针赋值和拷贝,而且在指针的生命周期内可以先后指向不同的对象。
2、指针无须在定义时赋初值。
引用没有实际地址,所以不能定义指向引用的指针
指针的4种状态:
1、指向一个对象。
2、指向紧邻对象所占空间的下一个位置。
3、空指针,指针未指向任何对象。
4、无效指针,上述情况之外的其他值。
生成空指针的方法
int *p1 = nullptr; //c+11新引入
int *p2 = 0;
int *p3 = NULL; //需要首先#include cstdlib
void*是一种特殊的指针类型,可以存放任意对象的地址。
指向指针的引用
int i = 42;
int *p;
int *&r = p;
r = &i;
&r = 0;
多个文件中出现同名的const变量时,其实等同于在不同文件中分别定义独立的变量。为此,我们只在一个文件中定义const,在其他多个文件中声明并使用它。
extern const int bufSize = fcn(); //定义并初始化一个常量
//另一个文件
extern const int bufSize;
const int ci = 1024;
const int &r1 = ci; //正确
int &r2 = ci; //错误
指向常量的指针
不能用于改变其所指对象的值,要想存放常量对象的地址,只能使用指向常量的指针。
const double pi =3.14;
double *ptr = π //错误
const double *cptr = π //正确
允许一个指向常量的指针指向一个非常量对象。
const指针
常指针,把*放在const关键字前用以说明指针是一个常量,不变的是指针本身而非指向的值。必须初始初始化。
指向常量的常量指针
const double *const p
顶层const表示任意对象是常量,底层const表示所指对象是一个常量。
C++11新标准规定,允许将变量声明为constexpr类型以便由编译器来验证变量的是否是一个常量表达式。
声明为constexpr的变量一定是一个常量,而且必须用常量表达式初始化。
constexpr int *q =nullptr //q是一个指向整数的常量指针
类型别名
typedef double wages;
typedef wages base, *p; //base是double同义词,p是double*同义词
别名声明
using SI = Sales_item;
注意指针别名与const组合时的用法!!!
auto
c+11新引入,auto让编译器通过初始值来推算变量的类型,因此auto定义的变量必须有初始值。
auto能在一条语句中声明多个变量,但所有变量的初始基本类型必须一样,因为一条声明语句只能有一个基本数据类型。
auto一般会忽略掉顶层const,同时底层const会被保留。
如果需要推断出auto类型是一个顶层const,需要明确指出
const auto f = ci;
decltype
c+11新引入,从表达式的类型推断要定义的变量类型,但不用该表达式的值初始化变量。
对于decltype所用的表达式来说,如果变量名加上了一对括号,则得到的结果永远是引用。
预处理器:确保头文件多次包含仍能安全工作的常用技术,在编译之前执行的一段程序,可以部分地改变我们所写的程序。
头文件保护:
#define指令把一个名字设定为预处理变量;#ifdef当且仅当变量已定义时为真;#ifndef当且仅当变量未定义时为真。一旦检查结果为真,则执行后续操作至#endif为止。