猫猫哥

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

变量和基本类型

不同平台下基本类型的字节数

类型

16位平台

32位平台

64位平台

char

1

1

1

short

2

2

2

int

2

4

4

long

4

4

8

long long

/

8

8

指针

2

4

8

float

4

4

4

double

8

8

8

 

类型的最小尺寸

类型

含义

最小尺寸

bool

布尔类型

未定义

char

字符

8位

wchar_t

宽字符

16位

char16_t

Unicode字符

16位

char32_t

Unicode字符

32位

short

短整型

16位

int

整型

16位

long

长整型

32

long long

长整型

64

float

单精度浮点数

6位有效数字

double

双精度浮点数

10位有效数字

long double

扩展双精度浮点数

10位有效数字

数据类型选择的经验准则

  • 当知晓数值不可能为负时,选用无符号类型
  • 使用int执行整数运算,short常常太小,long和int一般尺寸一样。如果int不够,用long long。

  • 在算数表达式中不要使用char或bool,使用char特别容易出问题。如果要使用一个不大的整数,那么明确执行为signed char或unsigned char。

  • 执行浮点数运算用double,float通常进度不够而且两者计算代价相差无几。Long double一般没有必要,且消耗不容忽视。

 

有符号类型和无符号类型

  • 无符号类型赋值超出其范围,结果是取模后的值。如unsigned char c = -1;  //假设char占8bit,c的值为255
  • 有符号类型赋值超出其范围,结果未定义。如signed char c2 = 256;  //假设char占8bit,c2的值未定义
  • 切勿混用带符号类型和无符号类型。
  • 算数表达式中既有无符号数又有带符号数,带符号的数会转换成无符号的数

 

指定字面值的类型

字符和字符串字面值

前缀

含义

类型

u

Unicode16字符

char16_t

U

Unicode32字符

char32_t

L

宽字符

wchar_t

u8

UTF-8(仅用于字符串字面常量)

char

整型字面值

浮点字面值

u or U

unsigned

f or F

float

l or L

long

l or L

long double

ll or LL

long long

 

 

初始化与赋值

初始化和赋值是两个完全不同的操作

  • 定义于函数体(块作用域)内的内置类型的对象如果没有初始化,则其值未定义。养成初始化内置变量的习惯。
  • 类的对象如果没有显式地初始化,则其值由类确定。

 

声明与定义

  • 声明使得一个名字为程序所知,定义会申请存储空间,还可能为其赋初始值
  • (分离式编译)

    如果想声明一个变量而非定义它,就在变量名前添加关键字extern,而且不要显式地初始化变量
  • 对于复杂的声明语句,可以从变量名从右往左理解

 

指针

  • 常见错误:解引用无效指针(空指针或已释放的指针)
  • 建议:初始化所有指针,并且尽量等定义了对象之后再定义指向它的指针。
  • 推荐nullptr而非0,0指针具有二义性。

 

const和constexpr

  • const对象默认在文件内有效,当多个文件出现了同名const变量,等同于不同文件中定义了独立的变量。

    如果想不同文件之间共享const,则不管在声明还是定义中都添加extern关键字。

  • 顶层const表示本身是个常量,底层const表示指针指向的对象是一个常量。

  • 执行对象拷贝操作时,顶层const不受影响,底层const却不容忽视

 

常量表达式:值不会改变且在编译阶段就能计算结果的表达式。

  • 复杂系统中很难分辨初始化是不是常量表达式,C11允许声明为constexpr由编译器来验证
  • 尽管指针和引用可以定义成constexpr,其初始值受到严格的限制。constexpr指针的初始值必须是nullptr或者0,或者是储存于某个固定地址中的对象。储存于函数体之外的对象其地址固定不变,能用来初始化constexpr指针。

 

auto与decltype

  • auto一般会忽略掉顶层const,同时保留底层const。
  • decltype的表达式是一个变量,则decltype返回该变量的类型,包括顶层const和引用在内。

  • decltype如使用的表达式不是一个变量,则返回表达式结果对应的类型。
  • 如表达式是解引用操作,则得到引用类型。

  • 如果是加了双层括号的变量,则结果永远是引用。

 

 

预处理变量无视C++中关于作用域的规则

posted on 2018-08-08 21:39  猫猫哥  阅读(1556)  评论(0编辑  收藏  举报