c++ primer 2 变量和基本类型
2.1 基本内置类型
基本内置类型是C++“自带”的类型,区别于标准库定义的类型。使用时不需要应用标准库就可以使用,我们可以理解为数字型有下面这些
整形:就是整数或者是没有小数位的数。它包括bool(0,!0) , char, wchar_t(非标准英文字符用char无法全部表现所以需要这个类型来表示),short, int ,long。 整形中除了bool外其他类型可以是带符号,也可以是无符号的,无符号的取值范围不能为负,有符号取值可以有正有负,但由于有符号数所占位其中一位是符号位所以它的正数取值范围要比无符号范围小一位。
浮点型:就是带小数的数,包括float , double , long double他们之间的区别是取值范围和精度,可以根据你的需要选择合适的类型。
char , wchar_t 两个类型虽然都是字符型但区别比较大:
- 在宽度上来说,一个是1byte,一个是2byte(在linux上实际是4byte)
- 在编码上来说 wchar_t表示unicode编码方式
- 以上不同说明 wchar_t 可以包含更多内容比如中文,日文等等。
建议:使用double类型基本上不会有错,在float类型中隐式的精读损失是不能忽视的,而双精度计算的代价相对于单精度可以忽略
2.2 字面值常量
就是常量本身,比如 21, “name” 表示类两种类型的字面值。有些类型有多重表示法,比如数字可以用不同进制表示,浮点型可以用科学计数法书写等等。
以0开头的是八进制,以0x或0x开头的表示十六进制,转移字符用\表示
C++所有字符串字面值都由编译器自动在末尾添加一个空字符: ‘A’ vs “A”
2.3 变量
变量提供了程序可以操作的有名字的存储区
变量是对数据的有名存储,既然有名就可以对改数据做一些操作如赋值修改等等。这里有两个表达式概念先了解一下
左值:左值可以出现在赋值语句的左面或者右面
右值:右值只能出现在赋值语句的右面儿不能出现在左面
变量是左值,常量是右值,字面值常量也是右值
初始化(重要)
C++支持两种初始化变量的形式:复制初始化和直接初始化。复制初始化语法用等号(=),直接初始化则是把初始化式放在括号中
int ival(1024);
int ival = 1024;
int ival;// 没有初始化内容,它的值由系统分配规则是在栈区和堆区(函数内定义或者类里面定义)都取随机值,在全局区(全局常量,静态变量)都是全零值。
初始化不是赋值:初始化是创建变量并给他赋值,赋值则是擦除对象的当前值并用新值代替
对内置类型来说,复制初始化和直接初始化几乎没有差别
对类类型的对象来说,有些初始化仅能用直接初始化完成
声明和定义
定义用于为变量分配存储空间
声明用于向程序表明变量的类型和名字,可以用extern关键字声明变量而不是定义它,extern是说明变量定义在程序的其他地方
注意如果声明有初始化式,那么可以被当作定义,即使声明标记为extern
extern double pi = 3.1415 //定义
变量必须且仅能定义一次,而且在使用变量之前必须定义或声明变量
一个文件含有变量的定义,使用变量的其他文件包含变量的声明
2.4 const限定符
限定符表示定义一个常量,常量一但定义则不可更改,所以必须在定义时初始化。
常量分为两类 编译时常量 和 运行时常量(在.NET中标示为readonly) 编译时常量是定义后直接初始化的常量,运行时常量值要初始化的值必须要通过代码运行才可以确定的
2.5 引用
引用是别名
引用就是对某个对象的另外一个别名。引用最重要的作用是函数传参。
const引用,可以读取但不能修改
注意分清常量引用还是变量引用
变量引用
int val = ; int &refval = val; // 引用了一个变量 int &refval1 = ; // 错误,12是个字面常量,常量必须要用常量引用 refval = ; // 等价于 val = 2 常量引用
const int val = ; const int &ref1 = val; // 引用了一个一般常量 const int &ref2 = ; // 引用了一个字面常量 int &ref3 = val; // 错误,常量必须要使用常量引用,ref3是个变量引用
int var = ;
const int &ref2 = var // 常量引用指向了一个变量,这时候
refval2 = ; // 不允许通过常量引用来做任何更改操作
varval = ; // 但是可以用原始变量来更改内容
对于引用还有一点很重要:非常量引用类型必须严格匹配,常量引用可以在内置类型之间相互引用
double a = 123.4; int &b = a; // 错误,类型不匹配 const int &c = a; // ok
// 这个操作实际等同于
int temp = a;
const int &c = temp;
2.6 typedef
2.7 枚举
枚举是一组可选常量值,既然是一组可选值说明包含多个常量。枚举定义语法如下
enum val{val1 = 2, val2 = 4, val3} // 最后一个内容没有显示给值等价于 val3 = 5
如果不指定值默认第一个值从0开始下一个依次+1递增。
枚举的每一项都是一个唯一的const类型值,上面的定义有点类似于:
const val1 = 2; const val2 = 4; const val3 = 5;
由于是const的,所以 val2 = 1 或者 val a = 2; 都不允许。
枚举项和int类型值有对应关系,但是二者只能单向转换,枚举可以自动转成int,而int却不能转成枚举
2.8 类类型
2.9 编写自己的头文件
头文件用于声明而不是定义
一些const对象定义在头文件中,当const为常量表达式放在头文件中(常量表达式是编译器在编译时就能够计算出结果的表达式),原因是const变量默认时定义该变量的文件的局部变量,所以把它们的定义放在头文件中是合法的
c++ primer 2 变量和基本类型的更多相关文章
- 再读《C++ Primer》——变量和基本类型
刚上大学那时,几个室友一块买了本<C++ Primer>第4版,看了一遍后就没怎么碰了,偶尔拿出来翻翻,当作工具书使用.后来知道有第5版了,一直觉得内容差不多吧.直到最近,再读其中的一些内 ...
- C++ Primer 读书笔记 第2章 变量和基本类型
C++ Primer 第二章 变量和基本类型 2.1 基本内置类型 C++定义了一组表示整数.浮点数.单个字符和布尔值的算术类型(arithmetic type),此外还定义了Void类型. 算术类型 ...
- C++ Primer 第2章 变量和基本类型
C++ Primer 第2章 变量和基本类型 C Primer 第2章 变量和基本类型 1 基本内置类型 算数类型 类型转换 字面值常量 2 变量 变量定义 3 复合类型 引用d左引用 指针d 4 c ...
- C++ Primer 笔记(2)第二章 变量与基本类型
第二章 变量与基本类型 1.基本内置类型包括算术类型和空类型,算术类型分为两类:整型(包括字符和布尔类型)和浮点型: 2.布尔类型(bool)的取值是真(true)或者假(false): 3.字面值常 ...
- C++ Primer : 第二章:变量和基本类型(1)
变量和基本类型之第一篇:基本内置类型和变量 一. (1) C++定义了一套包括算数类型和空类型,这些类型有:布尔类型bool,字符类型char,宽字符类型wchar_t,Unicode字符char16 ...
- C++ Primer 学习笔记_5_变量和基本类型(续2)
变量和基本类型 七.枚举 枚举不但定义了整数常量集,并且还把它们聚集成组. 枚举与简单的const常量相比孰优孰劣, 通过以下一段代码. 一看便知: enum {input, output, a ...
- <<C++ Primer>> 第二章 变量和基本类型 术语表
术语表 第 2 章 变量和基本类型 地址(address): 是一个数字,根据它可以找到内存中的一个字节 别名生命(alias declaration): 为另一种类型定义一个同义词:使用 &q ...
- C++拾遗(一)——变量和基本类型
今天看到一个小小的算法,交换两个数却不引入中间变量,想了下没什么思路.看了答案是这样: int a, b; a = a + b; b = a - b; a = a - b; 感觉还是挺有想法的,借此也 ...
- C和指针 第三章 变量的储存类型 auto、static、register以及static关键词
变量的储存类型决定标量何时创建,何时销毁以及他的值保持多久.有三个地方可以储存变量: 普通内存static 运行时堆栈auto 硬件寄存器register 变量的缺省储存类型取决于它的声明位置: 静态 ...
随机推荐
- Centos 下 error while loading shared libraries: libopencv_core.so.3.0
error while loading shared libraries: libopencv_core.so.3.0 Check if those libraries are present in ...
- 1.UiDevice API 详细介绍
1.UiDevice按键与keycode使用 返回值 方法名 说明 boolean pressBack() 模拟短按返回back键 boolean pressDPadCenter() 模拟按轨迹球中点 ...
- mysql 如何解决字段不区分大小写的问题
当我们输入不管大小写都能查询到数据,例如:输入 aaa 或者aaA ,AAA都能查询同样的结果,说明查询条件对大小写不敏感. 解决方案一: 于是怀疑Mysql的问题.做个实验:直接使用客户端用sql查 ...
- 「Python实践」学习之路
一.列表内容对比 方式一: import operatorl1 = ['a','b','c']l2 = ['a','d','e']print(operator.lt(l1,l2))运行结果为True ...
- Sql2008 全文索引创建
在SQL Server 中提供了一种名为全文索引的技术,可以大大提高从长字符串里搜索数 据的速度,不用在用LIKE这样低效率的模糊查询了. 下面简明的介绍如何使用Sql2008 全文索引 一.检查 ...
- 前端PHP入门-020-重点日期函数之获取时期时间信息函数
你需要知道关于时间的几个概念: 时区/世界时/unix时间戳 1.时区 这个概念,之前大家听说过很多.我们来啰嗦两句,我们现实生活中使用的实区,在电脑里面也是一样有规定的. 1884年在华盛顿召开国际 ...
- NOIP模拟赛15
NOIP2017金秋冲刺训练营杯联赛模拟大奖赛第一轮Day1 T1 天天去哪儿吃 直接枚举 #include<cstdio> #include<algorithm> using ...
- HDU 5700 优先队列(或者multiset) 或 线段树
题目大意:有n个区间,求k个区间,使得这k个区间相交的区间内数字之和最大.数列的数字均>=0 优先队列思路: 按照左端点sort,然后枚举左端点,假设他被覆盖过k次,然后用优先队列来维护最右端即 ...
- 【洛谷 P2120】 [ZJOI2007]仓库建设(斜率优化)
题目链接 斜率优化+1,好吧不水分了. 玩具装箱那题以后再做,当作复习吧. \(f[i]=f[j]-(sum[i]-sum[j])*dis[i]+p[i]\) \(f[j]=-dis[i]*sum[j ...
- NYOJ 141 Squares (数学)
题目链接 描述 A square is a 4-sided polygon whose sides have equal length and adjacent sides form 90-degre ...