C++学习 【2】 数据类型和表达式
2016-01-25 00:00
309 查看
学习《C++程序设计》(第二版) 谭浩强 主编
第二章 数据类型和表达式
目录:
2.1 C++的数据类型
2.2 常量
2.3 C++的运算符
2.4 C++的运算符
2.5 算术运算符与算术表达式
2.6 赋值运算符和赋值表达式
2.7 逗号运算符和逗号表达式
2.1 C++的数据类型
数据结构指的是数据的组织形式。例如,数组就是一种数据结构
C++可以使用的数据类型如下:
由以上这些数据类型还可以构成更复杂的数据结构
例如,利用指针和结构体可以构成表、树、栈等复杂的数据结构
C++没有统一规定各类数据的精度、数值范围和在内存中所占的字节数,各种C++编译系统根据自己的情况作出安排
2.2常量
2.2.1什么是常量
2.2.2数值常量
2.2.3字符常量
1.普通的字符常量
用单撇号括起来的一个字符就是字符常量。如'a','#','%'都是合法的字符常量,在内存中占一个字节
注意: a.字符常量值包括一个字符,如‘AB’是不合法的
b.字符常量区分大小写字母,如'A'和'a'是两个不同的字符常量
c.撇号是定界符,而不属于字符常量的一部分
2.转义字符常量
除了以上形式的字符常量外,C++还允许用一种特殊形式的字符常量,就是以“\”开头的字符序列
意思就是将\后的字符转换成另外的意思
3.字符数据在内存中的存储形式及其使用方法
将一个字符常量存放在内存单元时,实际上并不是把该字符本身放到内存单元中去,而是将该字符相应的ASCII代码放到存储单元中
4.字符串常量
用双撇号括起来的字符就是字符串常量
编译系统会在字符串最后自动加一个'\0'作为字符串结束标志
但‘\0'并不是字符串的一部分,它只是作为字符串的结束标志
举例:'a'和"a"代表不同的含义,前者是字符常量,占1个字节,后者是字符串常量,占2个字节
字符串常量要用字符数组来存放
举例:"abc\n"包含4个字符,但在内存中占5个字节
举例:cout<<"i say \"thank you! \" \n" 的输出是 i say "thank you!"
如果在一个字符串中最后一个字符为"\",则表示它是续行符,下一行的字符是该字符串的一部分,且在两行字符串间无空格
举例:cout<<"We must study C\ //本行最的“\”后面的空格和换行均不起作用
++ hard!" //本行的字符紧连在上一行最后的“\”前面字符之后
的输出是"We must study C ++ hard!
2.2.4 符号常量
为了编程和阅读的方便,可以用一个符号名代表一个常量,称为符号常量,即以标识符形式出现的常量
如:#define PRICE 30 //注意这不是语句,不需要加分号
符号常量在C程序中用的较多,在C++程序中常用常变量而较少用符号变量
2.3变量
2.3.1什么是变量
一个变量应该有一个名字,并在内存中占据一定的存储单元
变量名代表内存中的一个存储单元,在对程序编译连接时系统给每个变量分配一个地址
在程序中从变量中取值,实际上是通过变量名找到对应的内存单元,从其中读取数据
2.3.2变量名规则
先了解标识符的概念。
和其他高级语言一样,用来标识变量、字符常量、函数、数组、类型等实体名字的有效字符序列称为标识符(identifier)
变量名是标识符的一种,变量的名字必须遵循标识符的命名规则
C++规定标识符只能由字母、数字和下划线3种字符组成,且第一个字符必须是字母或者下划线
C++中区分大小写
C++没有规定标识符的长度(字符个数),但各个具体的C编译系统都有自己的规定
2.3.3定义变量
在C++中,要求对所有用到的变量做强制定义,也就是必须“先定义,后使用”
2.3.4对变量赋初值
初始化不是在编译阶段完成的(只有静态存储变量和外部变量的初始化是在编译阶段完成的)
而是在程序运行时执行本函数时赋予初值的,相当于执行一个赋值语句。例如,
int a =3;
相当于以下两个句子:
int a;
a=3;
2.3.5常变量
在定义变量时,如果加上关键字const,则变量的值在程序运行期间不能改变,这种变量称为常变量(constant variable)
例如: const int a = 3
在定义常变量时必须同时对它初始化,此后它的值不能再改变。
本质:从计算机实现的角度看,变量的特征是存在一个以变量名命名的存储单元,在一般情况下,存储单元中的内容是可以变化的。
对常变量来说,无非在此变量的基础上加一个限定:存储单元中的值不允许变化。
因此常变量又称为只读变量(read_only_variable)
2.4 C++的运算符
C++提供以下运算符:
1.算术运算符:+ - * % ++ --
2.关系运算符:> < ==(等于) >= <= !=
3.逻辑运算符:&&(逻辑与) ||(逻辑或) !(逻辑非)
4.位运算符:<<(按位左移) >>(按位右移) &(按位与) |(按位或) 异或 ~(按位取反)
5.赋值运算符:=及其拓展
6.条件运算符: ?:
7.逗号运算符:,
8.指针运算符:*
9.引用运算符和地址运算符(&)
10.求字节数运算符:sizeof
11.强制类型转换运算符: (类型)或者 类型()
12.成员运算符: .
13.指向成员的运算符:->
14.下标运算符:[ ]
15.其他:如函数调用运算符: ()
2.5 算术运算符与算术表达式
2.5.1基本的算术运算符
%:模运算符,或称求余运算符,%两侧均应为整型数据
需要说明的是,两个整数相除的结果为整数,如5/3的结果为1,舍去小数部分
但是,如果除数或者被除数有一个为负值,则舍入的方向是不固定的,看具体的编译系统
如果参与+ - * /运算的两个数中有一个数为float型数据,则运算的结果是double型,因为C++在运算时对所有float型数据都按double型数据处理
2.5.2算术表达式和运算符的优先级和结合性
2.5.3表达式中各类数值型数据间的混合运算
2.5.4自增(++)和自减(--)运算符
++i:在使用i之前,先使i的值加一
i++:在使用之后,使i的值加一
请注意:
1.++和--,只能用于变量,而不能用于常量和表达式
2.++和--的结合方向为“自右向左”
-(i++)先用原值加上负号输出,然后使i加1
3.主张不要过多地依赖使用++和--运算符的技巧,要遵循安全第一,易于理解的原则
2.5.5强制类型转换运算符
在表达式中不同类型的数据会自动地转换类型,以进行运算。
有时程序编制者还可以利用强制类型转换运算符将一个表达式转换成所需的类型
例如:
(double)a
(int) (x+y)
(float)(5%3)
注意:如果要强制转化的对象是一个变量,该变量可以不用括号括起来
以上强制转换类型的形式是原来C语言使用的,C++把它们保留了下来,以利于兼容
C++还增加了以下形式:
类型名(表达式)
如:int(x+y)
这种形式类似于函数调用
需要说明的是:在强制类型转换时,得到一个所需类型的中间数据,但原来变量的类型未发生变化。
在函数调用时,有时为了使实参与形参类型一致,可以用强制类型转换运算符得到一个所需类型的参数
2.6赋值运算符和赋值表达式
2.6.1赋值运算符
2.6.2赋值过程中的类型转换
注意几点:
1.字符型数据赋给整型变量,将字符的ASCII码赋给整型变量
2.将一个int,short或long型数据赋给一个char型变量,只将其低8位(二进制)原封不动地送到char型变量(发生截断)
如:short int i = 289; // 0000 0001 0010 0001
char c;
c=i;
这种情况下得到的C为!(ASCII码为33)
3.将signed(有符号)型数据赋给长度相同的unsigned(无符号)型变量,将其存储单元内容原样照搬(连原有的符号位也作为数值一起传送)
4.不同类型的整型数据间的赋值归根到底就是一条:按存储单元中的存储形式直接传送
2.6.3复合赋值运算符
在赋值符=之前加上其他运算符,可以构成复合运算符
+= *= %= 等等
凡是二元(二目)运算符,都可以与赋值符一起组合成复合赋值符
采用这种复合运算符,一是为了简化程序,而是为了提高编译效率
初学者可以不用或者少用
2.6.4赋值表达式
变量=表达式
C++将赋值表达式作为表达式的一种,使复制操作不仅可以出现在赋值语句中,而且可以以表达式形式出现在其他语句
2.7逗号运算符和逗号表达式
C++提供一种特殊的运算符--逗号运算符,又称为“顺序求值运算符”,用它将两个表达式连接起来
逗号表达式的一般形式为:表达式1,表达式2
逗号表达式的求解过程是:先求解1,再求解2.整个逗号表达式的值是表达式2的值
如:(a=3*5,a*4), a+5 a的值为15,整个逗号表达式的值为20
逗号运算符是所有运算符中级别最低的
其实,逗号表达式无非就是把若干个表达式“串联”起来
在许多情况下,使用逗号表达式的目的只是想分别得到各个表达式的值,而并非一定需要得到和使用整个逗号表达式的值
逗号表达式最常用与循环语句(for语句)中
C和C++语言表达能力强,其中一个重要方面就在于它的表达式类型丰富,运算符功能强,因而使用灵活,适应性强
第二章 数据类型和表达式
目录:
2.1 C++的数据类型
2.2 常量
2.3 C++的运算符
2.4 C++的运算符
2.5 算术运算符与算术表达式
2.6 赋值运算符和赋值表达式
2.7 逗号运算符和逗号表达式
2.1 C++的数据类型
数据结构指的是数据的组织形式。例如,数组就是一种数据结构
C++可以使用的数据类型如下:
由以上这些数据类型还可以构成更复杂的数据结构
例如,利用指针和结构体可以构成表、树、栈等复杂的数据结构
C++没有统一规定各类数据的精度、数值范围和在内存中所占的字节数,各种C++编译系统根据自己的情况作出安排
2.2常量
2.2.1什么是常量
2.2.2数值常量
2.2.3字符常量
1.普通的字符常量
用单撇号括起来的一个字符就是字符常量。如'a','#','%'都是合法的字符常量,在内存中占一个字节
注意: a.字符常量值包括一个字符,如‘AB’是不合法的
b.字符常量区分大小写字母,如'A'和'a'是两个不同的字符常量
c.撇号是定界符,而不属于字符常量的一部分
2.转义字符常量
除了以上形式的字符常量外,C++还允许用一种特殊形式的字符常量,就是以“\”开头的字符序列
意思就是将\后的字符转换成另外的意思
3.字符数据在内存中的存储形式及其使用方法
将一个字符常量存放在内存单元时,实际上并不是把该字符本身放到内存单元中去,而是将该字符相应的ASCII代码放到存储单元中
4.字符串常量
用双撇号括起来的字符就是字符串常量
编译系统会在字符串最后自动加一个'\0'作为字符串结束标志
但‘\0'并不是字符串的一部分,它只是作为字符串的结束标志
举例:'a'和"a"代表不同的含义,前者是字符常量,占1个字节,后者是字符串常量,占2个字节
字符串常量要用字符数组来存放
举例:"abc\n"包含4个字符,但在内存中占5个字节
举例:cout<<"i say \"thank you! \" \n" 的输出是 i say "thank you!"
如果在一个字符串中最后一个字符为"\",则表示它是续行符,下一行的字符是该字符串的一部分,且在两行字符串间无空格
举例:cout<<"We must study C\ //本行最的“\”后面的空格和换行均不起作用
++ hard!" //本行的字符紧连在上一行最后的“\”前面字符之后
的输出是"We must study C ++ hard!
2.2.4 符号常量
为了编程和阅读的方便,可以用一个符号名代表一个常量,称为符号常量,即以标识符形式出现的常量
如:#define PRICE 30 //注意这不是语句,不需要加分号
符号常量在C程序中用的较多,在C++程序中常用常变量而较少用符号变量
2.3变量
2.3.1什么是变量
一个变量应该有一个名字,并在内存中占据一定的存储单元
变量名代表内存中的一个存储单元,在对程序编译连接时系统给每个变量分配一个地址
在程序中从变量中取值,实际上是通过变量名找到对应的内存单元,从其中读取数据
2.3.2变量名规则
先了解标识符的概念。
和其他高级语言一样,用来标识变量、字符常量、函数、数组、类型等实体名字的有效字符序列称为标识符(identifier)
变量名是标识符的一种,变量的名字必须遵循标识符的命名规则
C++规定标识符只能由字母、数字和下划线3种字符组成,且第一个字符必须是字母或者下划线
C++中区分大小写
C++没有规定标识符的长度(字符个数),但各个具体的C编译系统都有自己的规定
2.3.3定义变量
在C++中,要求对所有用到的变量做强制定义,也就是必须“先定义,后使用”
2.3.4对变量赋初值
初始化不是在编译阶段完成的(只有静态存储变量和外部变量的初始化是在编译阶段完成的)
而是在程序运行时执行本函数时赋予初值的,相当于执行一个赋值语句。例如,
int a =3;
相当于以下两个句子:
int a;
a=3;
2.3.5常变量
在定义变量时,如果加上关键字const,则变量的值在程序运行期间不能改变,这种变量称为常变量(constant variable)
例如: const int a = 3
在定义常变量时必须同时对它初始化,此后它的值不能再改变。
本质:从计算机实现的角度看,变量的特征是存在一个以变量名命名的存储单元,在一般情况下,存储单元中的内容是可以变化的。
对常变量来说,无非在此变量的基础上加一个限定:存储单元中的值不允许变化。
因此常变量又称为只读变量(read_only_variable)
2.4 C++的运算符
C++提供以下运算符:
1.算术运算符:+ - * % ++ --
2.关系运算符:> < ==(等于) >= <= !=
3.逻辑运算符:&&(逻辑与) ||(逻辑或) !(逻辑非)
4.位运算符:<<(按位左移) >>(按位右移) &(按位与) |(按位或) 异或 ~(按位取反)
5.赋值运算符:=及其拓展
6.条件运算符: ?:
7.逗号运算符:,
8.指针运算符:*
9.引用运算符和地址运算符(&)
10.求字节数运算符:sizeof
11.强制类型转换运算符: (类型)或者 类型()
12.成员运算符: .
13.指向成员的运算符:->
14.下标运算符:[ ]
15.其他:如函数调用运算符: ()
2.5 算术运算符与算术表达式
2.5.1基本的算术运算符
%:模运算符,或称求余运算符,%两侧均应为整型数据
需要说明的是,两个整数相除的结果为整数,如5/3的结果为1,舍去小数部分
但是,如果除数或者被除数有一个为负值,则舍入的方向是不固定的,看具体的编译系统
如果参与+ - * /运算的两个数中有一个数为float型数据,则运算的结果是double型,因为C++在运算时对所有float型数据都按double型数据处理
2.5.2算术表达式和运算符的优先级和结合性
2.5.3表达式中各类数值型数据间的混合运算
2.5.4自增(++)和自减(--)运算符
++i:在使用i之前,先使i的值加一
i++:在使用之后,使i的值加一
请注意:
1.++和--,只能用于变量,而不能用于常量和表达式
2.++和--的结合方向为“自右向左”
-(i++)先用原值加上负号输出,然后使i加1
3.主张不要过多地依赖使用++和--运算符的技巧,要遵循安全第一,易于理解的原则
2.5.5强制类型转换运算符
在表达式中不同类型的数据会自动地转换类型,以进行运算。
有时程序编制者还可以利用强制类型转换运算符将一个表达式转换成所需的类型
例如:
(double)a
(int) (x+y)
(float)(5%3)
注意:如果要强制转化的对象是一个变量,该变量可以不用括号括起来
以上强制转换类型的形式是原来C语言使用的,C++把它们保留了下来,以利于兼容
C++还增加了以下形式:
类型名(表达式)
如:int(x+y)
这种形式类似于函数调用
需要说明的是:在强制类型转换时,得到一个所需类型的中间数据,但原来变量的类型未发生变化。
在函数调用时,有时为了使实参与形参类型一致,可以用强制类型转换运算符得到一个所需类型的参数
2.6赋值运算符和赋值表达式
2.6.1赋值运算符
2.6.2赋值过程中的类型转换
注意几点:
1.字符型数据赋给整型变量,将字符的ASCII码赋给整型变量
2.将一个int,short或long型数据赋给一个char型变量,只将其低8位(二进制)原封不动地送到char型变量(发生截断)
如:short int i = 289; // 0000 0001 0010 0001
char c;
c=i;
这种情况下得到的C为!(ASCII码为33)
3.将signed(有符号)型数据赋给长度相同的unsigned(无符号)型变量,将其存储单元内容原样照搬(连原有的符号位也作为数值一起传送)
4.不同类型的整型数据间的赋值归根到底就是一条:按存储单元中的存储形式直接传送
2.6.3复合赋值运算符
在赋值符=之前加上其他运算符,可以构成复合运算符
+= *= %= 等等
凡是二元(二目)运算符,都可以与赋值符一起组合成复合赋值符
采用这种复合运算符,一是为了简化程序,而是为了提高编译效率
初学者可以不用或者少用
2.6.4赋值表达式
变量=表达式
C++将赋值表达式作为表达式的一种,使复制操作不仅可以出现在赋值语句中,而且可以以表达式形式出现在其他语句
2.7逗号运算符和逗号表达式
C++提供一种特殊的运算符--逗号运算符,又称为“顺序求值运算符”,用它将两个表达式连接起来
逗号表达式的一般形式为:表达式1,表达式2
逗号表达式的求解过程是:先求解1,再求解2.整个逗号表达式的值是表达式2的值
如:(a=3*5,a*4), a+5 a的值为15,整个逗号表达式的值为20
逗号运算符是所有运算符中级别最低的
其实,逗号表达式无非就是把若干个表达式“串联”起来
在许多情况下,使用逗号表达式的目的只是想分别得到各个表达式的值,而并非一定需要得到和使用整个逗号表达式的值
逗号表达式最常用与循环语句(for语句)中
C和C++语言表达能力强,其中一个重要方面就在于它的表达式类型丰富,运算符功能强,因而使用灵活,适应性强
相关文章推荐
- 历史上出现过的主流C/C++ 编译器都有哪些?
- C++学习 【3.2】 程序设计初步---输入、输出&关系运算、逻辑运算
- Thrift C++ 多路复用可实现多个Service
- Java 和 C++ return 对象、数组的区别
- C++命名规范
- C++变量声明
- 一起talk C栗子吧(第一百一十一回:C语言实例--线程间通信)
- printf的输出相关
- A + B问题(字符串与数字之间的转换)
- C#与C/C++部分基础语法差异
- 重温C语言小感
- 模板的实例化和具体化
- 1025. PAT Ranking (25)
- c++ unique_lock lock_guard
- 2016/1/24 刷题所得
- 开始学习与进化之旅!
- 大一上学期C语言学习心得总结
- 大一上学期C语言学习心得总结
- C++ string 字符串函数详解
- 「C语言」「概念」常量和变量的表示及应用