变量和基本类型

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

类型

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++中关于作用域的规则

最新文章

  1. PHP 随手记
  2. Java通过几种经典的算法来实现数组排序
  3. this关键字
  4. java基础算法之冒泡排序
  5. json对象与字符串互转
  6. combobox远程加载数据的总结和Json数据的小结
  7. Spring学习之Ioc控制反转(2)
  8. 转:Selenium中的几种等待方式,需特别注意implicitlyWait的用法
  9. 进击的AssetBundles和它的工具们
  10. 网络唤醒全攻略(Wake On Lan)
  11. Java之数据类型,变量赋值
  12. node上传文件并在网页中展示
  13. Android源码浅析(六)——SecureCRT远程连接Linux,配置端点和字节码
  14. 极光推送JAVA代码示例
  15. mysql中使用存储过程方法中的注意事项
  16. Memcached技术
  17. 如何修改maven的默认jdk版本
  18. Luogu 1068 - 分数线划定 - [快速排序]
  19. 浏览器关闭、刷新、关闭标签事件,兼容IE8,chrome,firefox
  20. [翻译] Trident-ML:基于storm的实时在线机器学习库

热门文章

  1. Oracle 固定执行计划-使用SPM(Sql Plan Management)固定执行计划
  2. 读书笔记 C# 控制台应用程序之Main方法浅析
  3. NetworkManager 命令配置nmcli注意
  4. DevExpress v18.1新版亮点——Windows 10 UWP篇
  5. srtvlet filter
  6. Exception in thread "main" org.apache.poi.poifs.filesystem.OfficeXmlFileException
  7. OSI七层网络模型与TCP/IP四层模型介绍
  8. Adaboost算法流程及示例
  9. magento首页点击任何产品都出现404错误的问题方法
  10. qt5 交叉编译