c++ primer 第二章 变量和基本类型

文章目录

    • 整型
      • 带符号和无符号类型
      • 整型的赋值
    • 浮点型
    • 字面值常量
      • 整型字面值规则
      • 浮点字面值规则
      • 布尔字面值和字符字面值
      • 非打印字符的转义序列
      • 字符串字面值
      • 多行字面值
    • 变量
      • 定义对象
      • 初始化
      • 定义和声明
        • extern
      • const:
      • typedef
      • 枚举
        • 定义和初始化枚举
      • 类和struct

整型

  • short、int 和 long 类型都表示整型值,存储空间的大小不同

带符号和无符号类型

  • 整型可以是带符号的(signed)也可以是无符号的
  • 整型 int、short 和 long 都默认为带符号型。要获得无符号型则必须指定该类型为 unsigned,比如 unsigned long。
  • unsigned int 类型可以简写为unsigned,也就是说,unsigned 后不加其他类型说明符意味着是 unsigned int
  • 无符号型中,所有的位都表示数值。如果在某种机器中,定义一种类型使用8 位表示,那么这种类型的 unsigned 型可以取值 0 到 255
  • 表示 signed 整型类型最常见的策略是用其中一个位作为符号位。符号位为1,值就为负数;符号位为 0,值就为 0 或正数。一个 signed 整型取值是从 -128到 127

整型的赋值

  • 当我们试着把一个超出其取值范围的值赋给一个指定类型的对象时,结果会怎样呢?答案取决于这种类型是 signed 还是 unsigned 的
  • 当我们试着把一个超出其取值范围的值赋给一个指定类型的对象时,结果会怎样呢?答案取决于这种类型是 signed 还是 unsigned 的
  • unsigned 类型
          ~~~~~      编译器会将该值对 unsigned 类型的可能取值数目求模,然后取所得值。比如 8 位的
          ~~~~~      unsigned char,其取值范围从 0 到 255(包括 255)。如果赋给超出这个范围的值,那么编       ~~~~~      译器将会取该值对 256 求模后的值。

            ~~~~~~~~~~~            例如,如果试图将 336 存储到 8 位的 unsigned char 中,则实际赋值为 80,因为80是336对 256 求模后的值

  • 相当于溢出的位数被舍弃了,因此减去高位值,即2的8次方,256;
  • C++ 中,把负值赋给 unsigned 对象是完全合法的,其结果是该负数对该类型的取值个数求模后的值,如:
  • 如果把 -1 赋给8 位的 unsigned char,那么结果是 255,因为 255 是 -1 对256 求模后的值
  • signed 类型
  • 很多的编译器处理 signed 类型的方式和 unsigned 类型类似
  • 赋值时是取该值对该类型取值数目求模后的值

浮点型

  • float、 double 和 long double 分别表示单精度浮点数(32 位)、双精度浮点数(64位)和扩展精度浮点数(96或158位)
  • float 型只能保证 6 位有效数字,而 double 型至少可以保证 10 位有效数字

字面值常量

  • 称之为字面值是因为只能用它的值称呼它,称之为常量是因为它的值不能修改
  • 每个字面值都有相应的类型,例如:0 是 int 型,3.14159 是 double 型

整型字面值规则

  • 字面值整数常量的类型默认为 int 或 long 类型
  • 通过增加后缀,能够强制将字面值整数常量转换为 long、unsigned 或 unsigned long类型
  • 例如:1024UL /* unsigned long

浮点字面值规则

  • 通常可以用十进制或者科学计数法来表示浮点字面值常量
  • 默认的浮点字面值常量为 double 类型,在数值的后面加上 F 或 f 表示单精度
  • 同样加上 L 或者 l 表示扩展精度
  • 例如:3.14159F1E-3F12.345L

布尔字面值和字符字面值

  • 单词 true 和 false 是布尔型的字面值
  • 可打印的字符型字面值通常用一对单引号来定义:'a' '2' ',' ' '
  • 这些字面值都是 char 类型的。在字符字面值前加 L 就能够得到 wchar_t类型的宽字符字面值

非打印字符的转义序列

换行符 \n    		水平制表符\t
纵向制表符 \v		退格符 \b
回车符 \r 			进纸符 \f
报警(响铃)符 \a 	反斜线 \\
疑问号 \? 			单引号 \'
双引号 \"
  • 字符’\0’通常表示“空字符(null character)”,我们将会看到它有着非常特殊的意义

字符串字面值

  • 字符串字面值是一串常量字符

  • 字符串字面值常量用双引号括起来的零个或者多个字符表示

  • C++ 中所有的字符串字面值都由编译器自动在末尾添加一个空字符

  • 'A'表示单个字符 A,然而"A"表示包含字母 A 和空字符两个字符的字符串

  • 字符串字面值的连接:

  • 两个相邻的仅由空格、制表符或换行符分开的字符串字面值(或宽字符串字面值),可连接成一个新字符串字面值

  • 例子:

std::cout << "a multi-line "
	"string literal "
	"using concatenation"
	<< std::endl;
  • 输出:a multi-line string literal using concatenation

多行字面值

  • 在一行的末尾加一反斜线符号可将此行和下一行当作同一行处理
  • 例子:
std::cou\
t << "Hi" << st\
d::endl;

// 等价于:
std::cout << "Hi" << std::endl;
  • 例子:
// multiline string literal
std::cout << "a multi-line \
string literal \
using a backslash"
<< std::endl;
  • 输出: a multi-line string literal using a backslash
  • 注意反斜线符号必须是该行的尾字符——允许有注释或空格符

变量

  • C++ 中的每一个变量都有特定的类型,该类型决定了变量的内存大小和布局、能够存储于该内存中的值的取值范围以及可应用在该变量上的操作集
  • 左值:左值可以出现在赋值语句的左边或右边
  • 右值(发音为 are-value):右值只能出现在赋值的右边,不能出现在赋值语句的左边
  • 变量是左值,因此可以出现在赋值语句的左边。数字字面值是右值,因此不能被赋值
  • 对象: 对象就是内存中具有类型的区域;
  • 我们可以自由地使用对象描述程序中可操作的大部分数据,而不管这些数据是内置类型还是类类型,是有名字的还是没名字的,是可读的还是可写的
  • 变量名,即变量的标识符,可以由字母、数字和下划线组成
  • 关键字则具有特殊含义,关键字不能用作程序的标识符,如下所示:
    c++ primer 第二章 变量和基本类型_第1张图片
  • 各种操作符的替代名,这些替代名用于支持某些不支持标准C++操作符号集的字符集。它们也不能用作标识符,如下所示:
    c++ primer 第二章 变量和基本类型_第2张图片
  • 变量命名习惯:
    a) 变量名一般用小写字母
    b) 标识符应使用能帮助记忆的名字,也就是说,能够提示其在程序中的用法的名字
    c) 包含多个词的标识符书写为在每个词之间添加一个下划线,或者每个内嵌的词的第一个字母都大写。例如通常会写成 student_loan 或studentLoan,而不写成 studentloan

定义对象

  • 每个定义都是以类型说明符开始,后面紧跟着以逗号分开的含有一个或多个说明符的列表

初始化

  • 定义时指定了初始值的对象被称为是已初始化的
  • C++ 支持两种初始化变量的形式:复制初始化直接初始化(直接初始化语法更灵活且效率更高)
  • 复制初始化语法用等号(=),直接初始化则是把初始化式放在括号中:
int ival(1024); // direct-initialization
int ival = 1024; // copy-initialization

注意:“初始化不是赋值” —— 初始化指创建变量并给它赋初始值,而赋值则是擦除对象的当前值并用新值代替;

  • 变量初始化规则
  • 内置类型变量的初始化:内置类型变量是否自动初始化取决于变量定义的位置。在函数体外定义的变量都初始化成 0,在函数体里定义的内置类型变量不进行自动初始化
  • 类类型变量的初始化:类通过定义一个或多个构造函数来控制类对象的初始化

定义和声明

  • 定义
    变量的定义用于为变量分配存储空间,还可以为变量指定初始值。在一个程序中,变量有且仅有一个定义

  • 声明
    用于向程序表明变量的类型和名字,不分配存储空间,可以声明多次。

extern
  • 定义也是声明:当定义变量时我们声明了它的类型和名字。可以通过使用extern 关键字声明变量名而不定义它。
  • 不定义变量的声明包括对象名、对象类型和对象类型前的关键字extern
extern int i; // declares but does not define i
int i; // declares and defines i
  • 声明有初始化式,那么它可被当作是定义,即使声明标记为 extern
extern double pi = 3.1416; // definition
  • 已初始化的 extern 声明被当作是定义,所以该变量任何随后的定义都是错误的:
extern double pi = 3.1416; 		// definition
double pi; 						// error: redefinition of pi
extern double pi; 				// ok: declaration not definition
  • 只有当 extern 声明位于函数外部时,才可以含有初始化式。

const:

  • 全局作用域声明的 const 变量是定义该对象的文件的局部变量。此变量只存在于那个文件中,不能被其他文件访问;
  • 使用extern,使得该变量可以在其它文件使用,extern const int bufSize = fcn();
  • 定义const常量和变量时,必须初始化
  • const 引用:指向 const 对象的引用;是只读的;(不能给const引用赋值或修改)
const int ival = 1024;
const int &refVal = ival;  //ok
int &ref2 = ival; 			//error,非const指向了const
  • 将引用绑定到不同的类型时所发生的事情,如
double dval = 3.14;
const int &ri = dval;

则相当于:

int temp = dval; // create temporary int from the double
const int &ri = temp; // bind ri to that temporary

如果 ri 不是 const,那么可以给 ri 赋一新值。这样做不会修改 dval,而是修改了 temp。

  • 非 const 引用只能绑定到与该引用同类型的对象
  • const 引用则可以绑定到不同但相关的类型的对象或绑定到右值

typedef

  • 用来定义类型的同义词:
typedef int exam_score; // exam_score is a synonym for int
  • 用作类型说明符:
exam_score test_result; // int test_result;

枚举

  • 我们经常需要为某些属性定义一组可选择的值,如0,1,2,但之间没有相关性
  • 枚举提供了一种替代的方法,不但定义了整数常量集,而且还把它们聚集成组
定义和初始化枚举
  • 格式:enum 枚举类型名 {枚举成员1, ..., 枚举成员n};
  • 默认地,第一个枚举成员赋值为 0,后面的每个枚举成员赋的值比前面的大1
  • 枚举成员是常量;枚举成员值可以是不唯一的;不能改变枚举成员的值;
// point2d is 2, point2w is 3, point3d is 3, point3w is 4
enum Points { point2d = 2, point2w,
point3d = 3, point3w };
  • 枚举类型的对象的初始化或赋值,只能通过其枚举成员同一枚举类型的其他对象来进行
Points pt3d = point3d; 	// ok: point3d is a Points enumerator
Points pt2w = 3; 		// error: pt2w initialized with int
pt2w = polygon; 		// error: polygon is not a Points enumerator
pt2w = pt3d; 			// ok: both are objects of Points enum type

类和struct

  • 使用 class 还是 struct 关键字来定义类,仅仅影响默认的初始访问级别
  • 如果使用 class 关键字来定义类,那么定义在第一个访问标号前的任何成员都隐式指定为 private;如果使用 struct 关键字,那么这些成员都是public

你可能感兴趣的:(c++,c++,primer,变量)