21天学通C++学习笔记(三):变量和常量
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++学习笔记(三):变量和常量的更多相关文章
- 21天学通C++学习笔记(九):类和对象
1. 类和对象 现实中的人等事物往往具备一些特征并且可以做某些事情,要在程序中模拟这些事物,需要一个结构,将定义其属性(数据)以及其可用这些属性执行的操作(函数)整合在一起.这种结构就是类,而这种结构 ...
- 21天学通C++学习笔记(八):指针和引用
1. 简述 C++最大的优点之一是,既可以用它来编写不依赖于机器(主要是内存)的高级应用程序,又可以用它来编写与硬件紧密协作的应用程序. 事实上C++让您能够在字节和比特级调整应用程序的性能,而要编写 ...
- 21天学通C++学习笔记(七):函数
1. 为什么需要函数 可将应用程序的内容划分成依次调用的逻辑块,让您能够划分和组织程序的执行逻辑,有助于提高可重用性. 2. 基本概念 是子程序,可接受参数,可有返回值. 要让函数执行其任务,必须调用 ...
- 21天学通C++学习笔记(四):数组和字符串
1. 数组 概念 是一组元素 这些元素是相同的数据类型 按顺序存储到内存中 目的是避免在业务需要时去重复声明很多同类型的变量 初始化 分别初始化:int i [5] = {1,2,3,4,5}; 全部 ...
- 21天学通C++学习笔记(二):C++程序的组成部分
1. 预处理器编译指令 预处理器是一个在编译前运行的工具. 预处理器编译指令是向预处理器发出的命令,总是以磅字符#大头. #include让预处理器获取指定文件并将它们放在编译指令所处的位置.#inc ...
- 21天学通C++学习笔记(一):入门
1. 基础概念 1.1 编程语言 旨在让人更容易得使用计算资源,充分利用电脑,不用人做一些重复劳动或持续参与. 1.2 可执行文件 是可运行的成品,应按程序员希望的那样做. 1.3 生成可执行文件的步 ...
- PL/SQL学习笔记之变量、常量、字面量、字符串
一:变量 1:变量声明与初始化 variable_name datatype(约束) [:= | DEFAULT 初始值] 如: sales , ); name ); a ; greetings ) ...
- Go语言学习笔记(2)——变量、常量
1. 变量(变量由字母.数字和下划线组成,且不能以数字开头!) 1.1 第一种 var name type // 未赋值时使用默认值 name = value 1.2 第二种: 根据所赋的值 ...
- 学习笔记(三)--->《Java 8编程官方参考教程(第9版).pdf》:第十章到十二章学习笔记
回到顶部 注:本文声明事项. 本博文整理者:刘军 本博文出自于: <Java8 编程官方参考教程>一书 声明:1:转载请标注出处.本文不得作为商业活动.若有违本之,则本人不负法律责任.违法 ...
随机推荐
- TELNET协议规范
ARPA Internet上的主机被要求采用并实现此标准. 介绍 TELNET Protocol的目的是提供一个相对通用的,双向的,面向八位字节的通信方法.它主要的目标是允许接口终端设备的标准方法和面 ...
- zufeoj 数值排序(简单题)
数值排序 时间限制: 1 Sec 内存限制: 128 MB提交: 186 解决: 45[提交][状态][讨论版] 题目描述 输入一串数字,把这串数字中的‘0’都看成空格,那么就得到一行用空格分割的 ...
- 源码编译安装ceph
标签(空格分隔): ceph,ceph安装,ceph运维 centos7系统,aarch64架构下安装最新版本的ceph(13.0.0),x86架构的环境无需修改脚本即可. 一,物理环境: 内核版本: ...
- Py修行路 python基础 (二十)模块 time模块,random模块,hashlib模块,OS及sys模块
一.前提介绍: 可以开辟作用域的只有类,函数,和模块 for循环 if,else: 不能开辟自己的作用域 避免程序复用和重复调用,将这些写到一个.py文件中,做成一个模块,进行调 ...
- composer 的设计原理及其基本用法
相信有在用PHP的朋友近年来常听到composer这个套件管理工具.它到底是做什么用的?又是为了解决什么问题而存在呢? 要了解这个,得先从历史开始说起…. PHP最早加载类的方法 初学PHP时,最早会 ...
- day2-心得
模块sys和os #!/usr/bin/env python # -*- coding: utf-8 -*- import sys sys.path #打印环境变量 print(sys.argv) # ...
- MIS系统部署方案
- Jquery改变td内容为1的颜色
Jquery改变td内容为1的颜色<table id="tb" > <tr> <td val="1">1</td> ...
- ubuntu 12.04的源更新
apt-get install vim 安装vim vim /etc/apt/sources.list deb http://mirrors.163.com/ubuntu/ precise main ...
- 每天一个Linux命令 - 【chkconfig】
[命令]:chkonconfig [语法]:chkconfig [选项] [功能介绍]:chkconfig 命令是Redhat兼容的Linux发行版中的系统服务管理工具,它可以查询和更新不同的运行等一 ...