1. 简述

  • 内存是一种临时存储器,也被称为随机存取存储器(RAM),所有的计算机、智能手机及其他可编程设备都包含微处理器和一定数量的内存,用地址来定位不同的存储区域,像编号一样。
  • 硬盘可以永久的存储数据。
  • 微处理器负责执行程序,它会从RAM中获取要执行的应用程序二进制码及相关联的数据,这包括显示到屏幕上的数据以及用户输入的数据。
  • 变量让程序员能够将数据临时存储一段时间,其实就是内存中存储单元地址的别名,便于使用,不易出错,也避免不小心覆盖原有数据。
  • 常量让程序员能够定义不允许修改的东西。

2. 变量

  • 变量类型

    • 向编译器指出了变量可存储的数据的性质,编译器将为变量预留必要的空间。
    • 无符号变量不能用于存储负值
    • bool适用于表示ON或OFF、有或没有、可用或不可用等设置和标记
    • char用于存储单个字符,长度为一个字节,正好适合在内存中用数字表示,因此基于ASCII码作为数字值存在了内存中,包含大小写字母、0-9以及一些特殊字符和特殊键击值(如DEL)
    • 取值范围
      • 不同数据类型、有无符号(一般符号位是最高有效位MSB)的变量取值范围不同,使用变量时要先选择合适取值范围的变量类型
      • 取值范围最大值加1或最小值减1,会导致回绕或溢出(如最大值加1是否变成最小的复数,取决于编译器行为),会导致应用程序行为不可测
    • POD(Plain Old Data),除了基本数据类型,还包括聚合数据类型(结构、枚举、共用体和类)
  • 变量名
    • 要友好,替代了数据在内存中的存储地址。
    • 描述性要好,比变量名过长要优先
    • 可以有数字、字母、_,但不可以数字开头,不能包含空格、保留字和算术运算符。
    • 变量用驼峰命名、函数和类等用Pascal命名,匈牙利命名已不太流行(以类型缩写开头)
  • 作用域
    • 在作用域外,变量时未定义的实体,编译器对其一无所知
    • 超出作用域或程序终止后,内存中的数据将丢失,除非程序显示地将其存储到硬盘等永久性存储介质中
    • 不同作用域的变量即使变量名相同,也被编译器视为不同的独立的实体
    • 全局变量不要轻易使用,因为别人可能会不小心修改到,更好的方式是通过返回值进行数据传递
  • 声明
    • 最好在声明后赋初始值,避免其初始值不可知。
    • 虽然可以同时声明和初始化多个变量,但最好需要时再声明,让代码易于理解。
  • 组块分隔符(chunking separator)
    • C++14引入,用单引号表示
    • 提高数字字面量的可读性
    • C#中有类似的,用逗号表示
  • 使用siezeof确定变量的长度
    • 变量长度指的是程序员声明变量时,编译器将预留多少内存,用于存储赋给该变量的数据,长度因类型而异。
    • sizeof的单位是字节
    • sizeof(int)
    • 即使同一数据类型,不同平台得到的长度也不同
    • 有无符号数取值范围不同,但长度相同
    • C++11引入了固定宽度的整型,让您能够以位为单位指定整数的宽度,需要包含头文件,都有int16_t等。
  • 缩窄转换错误
    • 使用取值范围较大的变量来初始化取值范围较小的变量时,将面临出现缩窄转换错误的风险。
    • 不会导致编译不通过,也不是必现的,但导致行为不可测
    • 可通过列表初始化禁止和避免:short anotherNum {largeNum}会提示报错
  • 使用auto自动推断类型
    • C#中有类似的var
    • C++11以上支持
    • 这将指定变量类型的任务留给了编译器,编译器检查赋给变量的初值的性质,再确定将变量声明为什么类型最合适
    • 必须对变量进行初始化,不然编译器无法进行判断,会有编译错误
    • 好处是让编程更加容易,也少写和避免人为判断类型
  • 使用typedef替换变量类型
    • typedef unsigned int STRICTLY_POSITIVE_INTEGER;
    • 将变量类型名替换为您认为方便的名字,即自己起了一个别名
    • C#中的using也可以做到
    • 编译器会去进行替换

3. 常量

  • 和变量类似,只是不能修改,同样占用内存空间,使用
  • 名称标识为其预留的空间的地址
  • 用于你不希望这个值被覆盖、修改时,这是一个好习惯,避免其他程序员或自己不小心的修改
  • 一定要初始化,避免不确定性,不要随机。。
  • 对变量操作时,一定要判断取值范围,避免溢出,可能会导致应用程序崩溃
  • 字面常量
    • 可以是任意类型,从C++14起,还可以使用二进制字面量:int i = 0b1010;
    • C++中还可以定义自己的字面量,如10_km
  • 使用const将变量声明为常量
    • 声明在编译期间长度固定的静态数组时,常量很有用
  • 使用constexpr定义常量表达式
    • 可以让常量声明像函数:constexpr double GetPi() {return 22.0 / 7;}
    • 在一个常量表达式中,可使用另一个常量表达式:constexpr double TwicePi() {return 2 * GetPi();}
    • 提供了优化可能性,可能在编译阶段引发优化,即编译器直接去进行替换,把表达式替换成值,比如第二个会把TwicePi()都替换为6.28571,从而避免计算。但不能保证一定有编译阶段优化,这时编译器会忽略constexpr,视为常规函数进行编译。
    • 包含头文件后,大多数编译器通过M_PI提供高精度的pi值
    • 常量表达式必须包含简单的实现,并返回简单类型
    • C++14中,常量表达式可包含决策结构,如if、switch
  • 使用#define定义常量
    • 不推荐,原始
    • 这个是一个预处理器宏,是简单的文本替换,不智能,编译器不知道也不关心常量的类型
    • 不是类型安全的
  • 枚举
    • 在有些情况下,变量/常量不是有一个特定的值,而且有一组特定的取值
    • 使用enum定义枚举,由一组称为枚举量(emumerator,Voilet)的常量组成
    • 每个枚举量被转换为整数
      • 第一个默认为0
      • 没有特别指定整数值时,每个都比前一个大1
      • 如果给某个枚举量指定了特定整数,那么下一个枚举量以此为基础加1,当然也可以连续两个枚举量设置不同的整数值

21天学通C++学习笔记(三):变量和常量的更多相关文章

  1. 21天学通C++学习笔记(九):类和对象

    1. 类和对象 现实中的人等事物往往具备一些特征并且可以做某些事情,要在程序中模拟这些事物,需要一个结构,将定义其属性(数据)以及其可用这些属性执行的操作(函数)整合在一起.这种结构就是类,而这种结构 ...

  2. 21天学通C++学习笔记(八):指针和引用

    1. 简述 C++最大的优点之一是,既可以用它来编写不依赖于机器(主要是内存)的高级应用程序,又可以用它来编写与硬件紧密协作的应用程序. 事实上C++让您能够在字节和比特级调整应用程序的性能,而要编写 ...

  3. 21天学通C++学习笔记(七):函数

    1. 为什么需要函数 可将应用程序的内容划分成依次调用的逻辑块,让您能够划分和组织程序的执行逻辑,有助于提高可重用性. 2. 基本概念 是子程序,可接受参数,可有返回值. 要让函数执行其任务,必须调用 ...

  4. 21天学通C++学习笔记(四):数组和字符串

    1. 数组 概念 是一组元素 这些元素是相同的数据类型 按顺序存储到内存中 目的是避免在业务需要时去重复声明很多同类型的变量 初始化 分别初始化:int i [5] = {1,2,3,4,5}; 全部 ...

  5. 21天学通C++学习笔记(二):C++程序的组成部分

    1. 预处理器编译指令 预处理器是一个在编译前运行的工具. 预处理器编译指令是向预处理器发出的命令,总是以磅字符#大头. #include让预处理器获取指定文件并将它们放在编译指令所处的位置.#inc ...

  6. 21天学通C++学习笔记(一):入门

    1. 基础概念 1.1 编程语言 旨在让人更容易得使用计算资源,充分利用电脑,不用人做一些重复劳动或持续参与. 1.2 可执行文件 是可运行的成品,应按程序员希望的那样做. 1.3 生成可执行文件的步 ...

  7. PL/SQL学习笔记之变量、常量、字面量、字符串

    一:变量 1:变量声明与初始化 variable_name datatype(约束) [:= | DEFAULT 初始值] 如: sales , ); name ); a ; greetings ) ...

  8. Go语言学习笔记(2)——变量、常量

    1. 变量(变量由字母.数字和下划线组成,且不能以数字开头!)      1.1 第一种 var name type // 未赋值时使用默认值 name = value 1.2 第二种: 根据所赋的值 ...

  9. 学习笔记(三)--->《Java 8编程官方参考教程(第9版).pdf》:第十章到十二章学习笔记

    回到顶部 注:本文声明事项. 本博文整理者:刘军 本博文出自于: <Java8 编程官方参考教程>一书 声明:1:转载请标注出处.本文不得作为商业活动.若有违本之,则本人不负法律责任.违法 ...

随机推荐

  1. 1112 Stucked Keyboard

    题意:坏掉的键若被按下,总是重复打出k次.比如,k为3,打出的序列如下—— thiiis iiisss a teeeeeest 坏掉的键是i和e,虽然iiisss中s也出现了3次,但它不是坏掉的键,因 ...

  2. PHP面向对象深入研究之【组合模式与装饰模式】

    组合模式 定义:组合模式定义了一个单根继承体系,使具有截然不同职责的集合可以并肩工作. 一个军队的案例, <?php abstract class Unit { // 个体 abstract f ...

  3. js中的Generators函数

    js中的Generators函数 generator一般操作 generator函数的作用就是函数体分段执行,yield表示分隔点 function *test() { console.log(1); ...

  4. leetcode784

    这道题经过独立思考,通过使用二进制编码的方式来进行处理.分几个步骤一层一层的处理,最终解决了,这道题感觉应该属于medimu级别. public class Solution { /// <su ...

  5. 通过DG_BROKE搭建Oracle11g_adg

    1.环境 db_primary db_stanby db版本 11.2.0.4.0 11.2.0.4.0 os版本 centos 6.4 centos 6.4 db_unique_name newte ...

  6. BIO与NIO、AIO的区别(转)

    IO的方式通常分为几种,同步阻塞的BIO.同步非阻塞的NIO.异步非阻塞的AIO. 一.BIO 在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSock ...

  7. 分布式系统CAP定理

    分布式系统领域有个著名的CAP定理: C-数据一致性: A-服务可用性: P-服务对网络分区故障的容错性 这三个特性在任何分布式系统中不能同时满足,最多同时满足两个 ZooKeeper是个CP的,即任 ...

  8. 24-从零玩转JavaWeb-包装类、自动装箱、自动拆箱

    一.什么是包装类 二.对基本数据类型包装的好处 三.装箱操作 四.拆箱操作 五.自动装箱 六.自动拆箱 七.字符串与基本数据类型和包装类的转换   八.包装类的缓存设计

  9. iBase4j前端01_bootstrap-suggest json-server模拟后台数据、bootstrap-suggest环境搭建、开启bootstrap-suggest的post和put请求

    1 准备 1.1 模拟的json数据 { "info": [ { "message": "信息", "value": [ ...

  10. 彻底清除Window7下的360注册表

    当流氓360遇到强迫症,将注定有一场厮杀... 今天装了个虚拟机,其中win7系统是在网上随便下载了一个,是非纯净版的,自带了360在内的好多软件,其他软件都轻松删掉,但查看注册表时发现竟然有360残 ...