表示数字 | 表示字符 | 布尔型 |
int -> 整型 | char -> 单字节字符 | bool (真或假) |
float -> 浮点型(单精度型) | wchar_t -> 双字节字符 | |
double -> 浮点型(双精度型) |
and | and_eq | asm | auto | bitand | bitor | bool | break |
case | catch | char | class | compl | const | const_cast | continue |
default | delete | do | double | dynamic_cast | else | enum | explicit |
export | extern | false | float | for | friend | goto | if |
inline | int | long | mutable | namespace | new | not | not_eq |
operator | or | or_eq | private | protected | public | register | reinterpret_cast |
return | short | signed | struct | sizeof | static | static_cast | throw |
switch | template | this | typeid | true | try | typedef | using |
typename | union | unsigned | virtual | void | volatile | wchar_t | while |
xor | xor_eq |
提示: 表格中的颜色没有任何含义, 纯色容易使眼睛疲劳, 用三种颜色表示仅仅是为了看起来不那么刺眼。
对于这些关键字我们现在没有任何必要去强行记住它, 随着学习的进行我们自然都会认识他们。
2.2 整型变量 声明一个整型变量的语法:
int 变量名 ;
还可以一次声明多个int型变量:
int 变量名1, 变量名2, 变量名3, ..., 变量名n ;
例如, 声明一个整型变量a:
int a ;
此时, a字符就代表着一个int型变量.
2.3 浮点型变量 浮点型变量可用float或double表示, float和double的区别就在于double型的变量比float表示的数据范围要大, 那么到底大多少呢? 稍后我们统一的讲解。 定义一个float型的变量:
float 变量名 ;
同样, 也可能一次声明多个float型变量:
float 变量名1, 变量名2, 变量名3, ..., 变量名n ;
例如:
float b ;
此时, b字符就代表着一个float型变量. 声明一个double型的变量:
double 变量名 ;
一次声明多个double型变量:
double 变量名1, 变量名2, 变量名3, ..., 变量名n ;
怎么样? 是不是很有规律? 声明一种数据类型的格式就是:
数据类型 变量名1个或多个 ;
记住, 声明完成后不要忘记加上最后面的分号(;)。
2.4 字符型变量 字符型变量分为基本字符型变量char与宽字符型变量wchar_t, 对于char 与wchar_t的区别见文章最后部分的"提高部分". 根据总结出来的定义变量的格式, 那么, 定义一个char型字符变量就是:
char 变量名一个或多个 ;
定义一个wchar_t型字符变量就是:
wchar_t 变量名一个或多个 ;
2.5 布尔型变量 布尔型数据只有两个值, true(真) 或 false(假), 其中true和flase都是C++的关键字, 那么, 什么是真, 什么是假呢? C++认为, 一个值只要不是0, 那么这个值就是真(true), 值为0就是假(false). 定义一个布尔型数据:
bool 变量名一个或多个.
到这里我们来总结下已经知道的变量类型以及这个变量能表示的取值范围, 需要注意的是, 这里的int 和unsigned int取值范围根据编译器决定的, 这点一定要清楚.
数据类型 | 取值范围 |
int | 与编译器有关 |
unsigned [int] | 与编译器有关 |
short [int] | -32768 ~ 32768 |
long [int] | -2147483648 ~ 2147483647 |
signed [int] | 同int |
signed short [int] | 同short int |
signed long [int] | 同long int |
unsigned short [int] | 同unsigned int |
unsigned long [int] | 0 ~ 4294967295 |
float | -3.4e-38 ~ 3.4e38 小数位6位 |
double | -1.7e-308 ~ 1.7e308 小数位15位 |
说明: 表格中用中括号[]括起来的int是指在使用时可以省略的意思, 例如定义一个无符号型变量n, 用 unsigned n ; 与 unsigned int n ; 的效果是相同的, 但不建议省略。
如果数字超过了这个范围就会产生错误(溢出)。 在较新的编译器上, 例如我们现在使用的GCC编译器, int型数据的范围为-2147483648 ~ 2147483647。
2.什么是常量? 常量是指程序在运行时其值不能改变的量。 2.1 整型常量 C++提供了三种进制对常量进行描述, 分别是八进制、十进制、十六进制: ①. 用八进制描述整型常量: 八进制由数字0-7组成, 满八进一, 用八进制描述一个整型常量用数字0作为前缀: 例如: 十进制的10用八进制描述: 012 十进制的16用八进制描述: 020 十进制的20用八进制描述: 024
②. 用十进制描述整型常量: 十进制由数字0-9组成, 满十进一, 用十进制描述整型常量同我们平时使用的十进制. 例如: 十进制的8: 8 十进制的16: 16 十进制的20: 20 ③. 使用十六进制描述整型常量: 十进制由数字0-9、a-f或A-F(不区分大小写)组成, 满十进一, 用十六进制描述整型常量常量用0x作为前缀. 例如: 十进制的10用十六进制描述: 0xA 十进制的16用十六进制描述;0x10 十进制的20用十六进制描述: 0x14 2.2 浮点型常量 浮点型常量与数学上的用法相同, 有两种表示方式: 一种是常规的计数法, 另一种是科学计数法: 1>. 常规计数法: 整数部分.小数部分 例如: 1.7、2.65、18.375
2>. 科学计数法: 由 整数部分.小数部分e或E指数部分组成 例如: 1.7x10的23次方表示为: 1.7e23 4x10的17次方表示为: 4e17 0.8的负5次方表示为: 0.8e-5 说明: C++可以使用后缀声明一个整型常量或浮点型常量的长度, 可以使用的后缀有L(l):长的, U(u):无符号的, F(f):浮点型的, 这里不区分大小写, 建议大写。 例如; 声明一个整型常量为long的整型, 1000L 声明一个long double型的常量: 1.2L 声明一个unsigned long int型的常量: 1024UL 未加后缀区分的整型常数一律默认为int型, 未加后缀区分的浮点型一律默认为double型, 浮点常数只能用十进制表示。 2.3 字符常量 字符常量用一对单引号('')括起来的一个或多个字符称为字符常量, 例如'A'、'BC'、'#'、'\n'(转义符)、'6'等, 其中'A'、'#'、'6'称为单字符常量, 'BC'称为双字符常量, '\n'为转义符。 对于双字符常量, 编译器将其解释为一个unsigned short int型。 何谓转义符? 转义符有自己的特殊含义, 它告诉编译器这些字符需要用特殊的方式进行处理, C++中的转义符:
转义字符 | 描述 |
\’ | 单引号 |
\” | 双引号 |
\\ | 反斜杠 |
\0 | 空字符(NUL) |
\ooo | o代表一位八进制数 |
\a | 响铃符 |
\b | 退格符 |
\f | 换页符 |
\n | 换行符 |
\r | 回车符 |
\t | 水平制表符 |
\v | 垂直制表符 |
\xhh | h代表一位十六进制 |
这些转义符的具体用法我们到讲输出语句时再介绍。
2.4 字符串常量 字符串常量是指用一对双引号括起来的零个或多个ASCII字符的序列, 并以NULL(0)结束的字符串, 例如"Hello, world!"就是一个字符串常量。 更多关于字符串的介绍将在以后的学习中进行。
2.5 符号常量: 用一个标识符来表示一个常量,称之为符号常量。 符号常量的定义形式:
#define 标识符 常量
#define是一条预处理命令, 称为宏定义命令, 其功能是把该标识符定义为其后的常量值。一经定义, 以后在程序中所有出现该标识符的地方均代之以该常量值。 例如:
#define PI 3.14
定义PI符号常量为值3.14, 以后在代码中出现"PI"字符的地方就代表着数值3.14。
3. 运算符 C++提供了以下几种运算符: 3.1 算术运算: + (加) - (减) * (乘) / (除) % (取余) - (取负) 说明: 当两数均为整型且被除数不为0才可进行取余运算。
3.2 关系运算: 关系运算, 又称比较运算, C++提供了6种关系运算: > 大于 < 小于 = 等于 >= 大于等于 <= 小于等于 == 等于(两个=号) != 不等于
3.3 逻辑运算: 逻辑运算符是根据表达式的值来返回真值或是假值。
运算符 | 名称 | 说明 |
&& | 逻辑与 | 同为真返回真 |
|| | 逻辑或 | 有一真返回真 |
! | 逻辑非 | 值为真返回假, 值为假返回真 |
3.4 赋值运算: 赋值语句的作用是把某个常量或变量或表达式的值赋值给另一个变量或左值表达式, 赋值符号为'='。 注意: 与等于符号(==)区分, 赋值是一个等号=, 而相等为两个等号。 等号左边的变量或左值表达式称为左值, 产生值的表达式我们称为右值, 常数只能作为右值。 例如:
i = 10 ; a = b = 0 ;
第一个的含义为将常量10赋值给变量i, 第二个赋值语句的意思是把0同时赋值给两个变量。
3.5 条件运算: 条件运算符的格式为:
逻辑表达式?表达式1:表达式2
在该运算中, 首先对逻辑表达式进行运算, 如果为真, 则返回表达式1的值; 如果为假, 则返回表达式2的值。 例如;
a = 10 ; b = 20 ; max = a > b ? a : b ;
因为a不大于b, 所以逻辑表达式的值为假, 因此返回表示式2的值, 即将b的值赋值给max。
3.6 运算符的优先级和结合性 在数学中, 我们知道, 先算乘除、再算加减, 若有括号先算括号里面的, 同样, 在C++中的运算符也有自己的优先级, 在多个运算符同时出先在同一表达式中程序将根据运算符的优先级决定先计算谁后计算谁。 运算符的结合性又称为运算流向, 它决定组成表达式的各个部分的计算流向。 比如在
n = a / b ;
中, 赋值运算的优先级低于加(+)号的优先级, 因此要先算a / b部分, 加(+)号的结合性为自左向右, 所以a是被除数, b是除数。 C++中一些基本运算符的结合性与优先级如下:
优先级 | 运算符 | 名称或含义 | 使用形式 | 结合方向 | 说明 |
1(最高) | [] | 数组下标 | 数组名[常量表达式] | 左到右 | |
() | 圆括号 | (表达式)/函数名(形参表) | |||
. | 成员选择(对象) | 对象.成员名 | |||
-> | 成员选择(指针) | 对象指针->成员名 | |||
2 | - | 负号运算符 | -表达式 | 右到左 | 单目运算符 |
(类型) | 强制类型转换 | (数据类型)表达式 | |||
++ | 自增运算符 | ++变量名/变量名++ | 单目运算符 | ||
-- | 自减运算符 | --变量名/变量名-- | 单目运算符 | ||
* | 取值运算符 | *指针变量 | 单目运算符 | ||
& | 取地址运算符 | &变量名 | 单目运算符 | ||
! | 逻辑非运算符 | !表达式 | 单目运算符 | ||
~ | 按位取反运算符 | ~表达式 | 单目运算符 | ||
sizeof | 长度运算符 | sizeof(表达式) | |||
3 | / | 除 | 表达式/表达式 | 左到右 | 双目运算符 |
* | 乘 | 表达式*表达式 | 双目运算符 | ||
% | 余数(取模) | 整型表达式/整型表达式 | 双目运算符 | ||
4 | + | 加 表达式+表达式 | 左到右 | 双目运算符 | |
- | 减 | 表达式-表达式 | 双目运算符 | ||
5 | << | 左移 | 变量<<表达式 | 左到右 | 双目运算符 |
>> | 右移 | 变量>>表达式 | 双目运算符 | ||
6 | > | 大于 | 表达式>表达式 | 左到右 | 双目运算符 |
>= | 大于等于 | 表达式>=表达式 | 双目运算符 | ||
< | 小于 | 表达式<表达式 | 双目运算符 | ||
<= | 小于等于 | 表达式<=表达式 | 双目运算符 | ||
7 | == | 等于 | 表达式==表达式 | 左到右 | 双目运算符 |
!= | 不等于 | 表达式!= 表达式 | 双目运算符 | ||
8 | & | 按位与 | 表达式&表达式 | 左到右 | 双目运算符 |
9 | ^ | 按位异或 | 表达式^表达式 | 左到右 | 双目运算符 |
10 | | | 按位或 | 表达式|表达式 | 左到右 | 双目运算符 |
11 | && | 逻辑与 | 表达式&&表达式 | 左到右 | 双目运算符 |
12 | || | 逻辑或 | 表达式||表达式 | 左到右 | 双目运算符 |
13 | ?: | 条件运算符 | 表达式1? 表达式2: 表达式3 | 右到左 | 三目运算符 |
14 | = | 赋值运算符 | 变量=表达式 | 右到左 | |
/= | 除后赋值 | 变量/=表达式 | |||
*= | 乘后赋值 | 变量*=表达式 | |||
%= | 取模后赋值 | 变量%=表达式 | |||
+= | 加后赋值 | 变量+=表达式 | |||
-= | 减后赋值 | 变量-=表达式 | |||
<<= | 左移后赋值 | 变量<<=表达式 | |||
>>= | 右移后赋值 | 变量>>=表达式 | |||
&= | 按位与后赋值 | 变量&=表达式 | |||
^= | 按位异或后赋值 | 变量^=表达式 | |||
|= | 按位或后赋值 | 变量|=表达式 | |||
15(最低) | , | 逗号运算符 | 表达式,表达式,… | 左到右 | 从左向右顺序运算 |
注意: 表格引用自 姜南(Slyar) 的博客, 并进行了部分修改, 已取得引用授权, 引用地址:http://www.slyar.com/blog/c-operator-priority.html
提高部分=======
1. char与wchar_t char与wchar_t的区别就在于占用的存储单元大小不同, char型数据在内存中占1字节(Byte), 而wchar_t型字符数据实际上就是unsigned short int型数据, 无符号短整型, 之所以会出现wchar_t字符型就是为了解决计算机字符的显示问题, 说到这里, 不得不提下ASCII与Unicode编码问题: 1>. 关于ASCII ASCII(American Standard Code for Information Interchange,美国信息互换标准代码) ASCII一共包含128个字符, 包括: 33个控制符号, 1个空格, 32个符号, 10个数字, 26个小写字母和26个大写字母。每个ASCII字符采用7位二进制编码的方式。 使用char型数据存储, char在内存中占一字节, 8位, 最多也只能表示256个不同的字符。
ASCII的优点: 十分可靠, 普遍扎根在我们的键盘、显示器、系统硬件、打印机、操作系统等, 用途十分广泛。 ASCII的缺点: ASCII, 美国信息互换标准代码, 美国原生, 不能满足其他国家文字的需求, 例如, 中国的汉字?英国的英镑符号(£)?等, 这些在ASCII都是找不到的。这也就意味着使用ASCII其他国家的文字在计算机中将无法正常被显示, 也根本无法显示, 因为找不到。 2>. 对ASCII的改进 由于ASCII不能很好的满足其他国家文字的需求, 所以人们迫切希望能对ASCII进行改进。 ①. 国际化标准组织的扩展方案 1967年, 国际化标准组织( ISO, International Organization for Standardization )推荐了ASCII的一个变种, 改动内容包括: 从ASCII中, 拿出 0x40('@'),、0x5B('[')、0x5C('\')、0x5D(']')、0x5E('^')、0x60(' ' ')、0x7B('{')、0x7C('|')、0x7D('}')、0x7E('~')这10个符号保留给各个国家单独使用。这显然不是解决ASCII国际化的好方法, 首先, 其他国家将这些保留字符重新定义为自己国家需要的字符后, 那么国际上的一致性将不能得到保证, 此外, 10个保留字符远远不能满足美国的东方的一些国家使用的象形文字需求, 比如我们中国的汉字。 ②. IBM公司的扩展方案 IBM公司采用了使用8位二进制编码方式来表示ASCII, 使用一个字节来储存字符, 这样, 相对于7位的ASCII就可以多出128个额外字符空位来补充ASCII。 IBM对ASCII的主要扩展为: 补充了一些重音字符、小写希腊字母、块图字符和线图字符。同时, 还将一些补充的字符分配到ASCII的一些不必要的控制字符上。 (注: 在操作系统还是字符模式的年代, 块图字符和线图字符常用来被应用软件装饰自己的程序显示) ③. 微软公司的扩展方案 1985年11月, Windows 1.0发布, 微软采用了自己定义的一套字符集, 这套字符集被称为"ANSI字符集", 是基于ANSI和ISO标准的一个草案。 在MS-DOS 3.3时代(1987年4月), 微软为了使不同国家的计算机都能正常的显示字符, 微软采用了代码页概念, 不同国家的字符被规定在不同的代码页上, 例如代码页第437页为美国英语, 850页为拉丁语-1。用户只要将代码页设置到自己所在的国家就能正常的进行工作, 但是如果用户尝试着将自己的文档拿到与另外一个使用不同代码页的用户的计算机上进行修改时, 自己的文档的某些字符将会显示成其他字符, 这还算好, 有解决方案, 应用软件可以通过将代码页信息储存到文件中, 使用时再进行一些代码页的转换。 但在后来, 随着代码页数量的剧增, Windows版本的不断升级, 代码页的混淆问题开始日益凸显, DS-DOS的代码页和Windows的代码页以及其他Windows版本的系统发生了不兼容, 例如MS-DOS代码页第855页西里尔语在Windows中的1251页西里尔语或者Macintosh的第10007页西里尔语还都不一样。
微软为了解决东方一些国家使用的象形文字问题, 使用了双字节字符集, 这些字符集同样在不同的代码页, 代码页936(简体中文)、949(韩文)、950(繁体中文)以及932(日文)。微软的这个双字节字符集和你象形的可能有所不同, 在这个双字节字符集中, 前128个字符仍然是ASCII(1字节), 较高的128个扩展字符以跟随第二个字节的方式用来表示象形文字(这两个字节被称为前导字节和尾随字节)。 所以在这个代码页中, 有一个字节的字符, 还有2个字节的字符, 这就导致了两个严重的问题: 1>. 在一段字符串中, 字符串的长度不能根据字节的个数确定, 要想确定字符串的长度必须检查每个字节是不是双字节字符的前导字节。 2>. 通过任意指向字符串中的一个指针, 无法知道前一个字符的地址, 通常要回到字符串的开始, 一直解析到指针所在的位置。 3>. Unicode 对ASCII扩展的过程中, 没有能够找到一个彻底解决世界上所有书面文字的表示方法, 很显然, 1个字节, 256个字符是无法表示世界上所有的书面文字的, 因此, Unicode诞生了。 Unicode使用16位(2字节)的二进制编码方式来表示字符, 我们知道, 16位最多能够表示65536个字符, 65536个字符对于世界上的所有书面文字以及一些特殊符号来说已经足够用了。在Unicode中, 不同国家使用不同的代码段, 例如, 0x0530 - 0x058F为亚美尼亚语 (Armenian) 、0x0600 - 0x06FF为阿拉伯文 (Arabic) 、0x0E00 - 0x0E7F为泰文 (Thai) 、0x2700 - 0x27BF为印刷符号 (Dingbats) 、0x4E00 - 0x9FBF为中文。 Unicode的优点: 只有一个字符集, 避免了二义性, 能够满足跨语言、跨平台进行文本转换、处理的要求。 Unicode的缺点: Unicode字符的字符串比ASCII字符串占用的内存大两倍。(笔者认为, 随着计算机性能的不断提高, 内存和外存容量的不断增加, Unicode这一缺点可以慢慢忽略) 笔者提示: 对于这些历史中描述的某些术语可以不去理解, 只要知道char字符所能描述的字符很少, 不能用来描述汉字、韩文等其他国家使用的文字或符号, 而wchar_t使用两个字节对字符进行描述, 可以描述世界上所有的书面文字即可。
2. 基本数据类型的字节数 不同的数据类型编译器为其分配的存储单元大小不同, 这也正是决定数据类型能表示的范围大小的原因, 比如int型数据, 当编译器将其指定为2字节时, 1字节(Byte)等于8比特(Bit), 比特也是信息量单位, 一位二进制数所包含的信息就是1比特, 如二进制数的01100011就是8比特, 一字节。
数据在计算机中都是已二进制数形式表示的(确切来说是用二进制补码以定点形式存放), 以整数为例, 在内存单元中, 每个整数是有符号位和数值位组成, 符号占一位, 0代表正, 1代表负, 后面是用二进制表示的数值为, 假定int为两字节(注意: 2字节是在旧的编译器上面, 我们现在使用的编译器int实际为4字节, 这里仅仅是为了方便描述)
在默认情况下整数变量都是有符号型的, 可以使用unsigned修饰使其变成无符号型的。 16位二进制数, 除去一位用来表示数的正负, 仅剩下15位用来表示数据, 15位二进制0或1最多能表示的整数为2^15 = 32768, 但是由于0的存在所以需要再减1, 这样, 2字节的int型数据所表示的范围就是-32768 - 32767了。其他的数据类型表示范围也可以根据这个思路进行计算。
相关数据类型所使用的字节数如下:
数据类型 | 占用字节数 |
char | 1字节 |
int | 不确定, 2或4字节 |
unsigned int | 不确定, 2或4字节 |
short [int] | 2字节 |
unsigned short [int] | 2字节 |
long [int] | 4字节 |
unsigned long [int] | 4字节 |
float | 4字节 |
double | 8字节 |
注意: 浮点型数据float和double没有无符号型这一用法。
总结: 今天介绍了C++中的基本数据类型与基本的运算符, 此外还有其他更多的数据类型与运算符没有介绍, 理论知识听的太多也会感觉到疲惫, 所以这里只是简单的描述了下, 我们只要对其有个大概的印象即可, 等用到时再详细讲述, 我们的原则就是: 引用王爽《汇编语言》书中的一句话, "以后用到的知识, 以后再说。", 今天的学习就到这里。
--------------------
wid, 2012.11.02
上一篇: