字节 byte 和字 word 通常 一个字节由8 位构成 而一个字由32 位构成 或者说是4个字节 但是 工作站操作系统现在正在朝64 位系统的方向转换
预定义的内置的[built in] 或称基本的primitive] 数据类型
字符型char 通常用来表示单个字符和小整数 它可以用一个机器字节来表示 ([可以] 非 [就是])
整型int 短整型short 长整型long 它们分别代表不同长度的整数值。 典型情况下 short 以半个字表示; int 以一个机器字表示; 而long 为一个或两个机器字。 在32 位机器中 int 和long 通常长度相同
浮点型float 双精度double 和长双精度long double 分别表示单精度浮点数 双精度浮点数和扩展精度的浮点数值 典型情况下 float 为一个字double 是两个字 long double 为三个或四个字 。 char short int 和long 称为整值类型 integral type
关于文字常量
当一个数值 例如1 出现在程序中时 它被称为文字常量 literal constant
称之为文字 是因为我们只能以它的值的形式指代它;称之为 常量 是因为它的值不能被改变。3.14159 是double 型的文字常量
文字常量是不可寻址的[ nonaddressable ] 尽管它的值也存储在机器内存的某个地方 但是我们没有办法访问它们的地址
在缺省情况下, 整型文字常量被当作是一个int 型的有符号值
20 // 十进制
024 // 八进制
0x14 // 十六进制
在整型文字常量前面
加一个0 ,该值将被解释成一个
八进制数;而在前面加一个0x 或0X 则会使一个整型文字常量被解释成十六进制数
文字常量后面加一个 L 或 l 字母L 的大写形式或者小写形式 将其指定为long 类型;后面加上 u 或 U 将其指定为一个无符号数;
指定无符号long 型的文字常量:1024UL 8Lu均可
一部分不可打印的字符 单引号 双引号以及反斜杠可以用如下的转义序列来表示 转义序列以反斜杠开头
newline(换行符) \n
horizontal tab(水平制表键) \t
vertical tab(垂直制表键)\v
backspace(退格键) \b
carriage return (回车键) \r
formfeed (进纸键) \f
alert (beel) (响铃符) \a
backslash (反斜杠键) \\
question mark (问号) \?
single quote (单引号) \'
double quote (双引号) \"
\ooo
这里的ooo 代表三个八进制数字组成的序列
字符文字前面可以加 L 例如 L'a' 这称为宽字符文字 类型为wchar_t 宽字符常量用来支持某些语言的字符集合 如汉语,日语。这些语言中的某些字符不能用单个字符来表示
如果两个字符串或宽字符串在程序中相邻 C++就会把它们连接在一起 并在最后加上一个空字符 例如
"two" "some"
它的输出结果是 twosome
如果将一个字符串常量与一个宽字符串常量连接起来 例如
// 不建议这样使用
"two" L"some"
结果是未定义的 undefined
一个字符串文字可以扩展到多行 在一行的最后加上一个反斜杠 表明字符串文字在下一行继续
"a multi-line \
string literal signals its \
continuation with a backslash"
字符串文字的类型是常量字符数组 它由字符串文字本身以及编译器加上的表示结束的 空 null 字符构成 例如
'A'
代表单个字符 A 下面则表示单个字符A 后面跟一个空字符
"A "
空字符是C 和C++用来标记字符串结束的符号
关于变量的左值与右值
1.它的数据值 存储在某个内存地址中 有时这个值也被称为对象的右值 rvalue ,读做are-value。我们也可认为右值的意思是被读取的值read value 文字常量和变量都可被用作右值
2.它的地址值——即 存储数据值的那块内存的地址 它有时被称为变量的左值 lvalue ,读作ell-value 我们也可认为左值的意思是位置值 location value 文字常量不能被用作左值
ch = ch - 'O';
在表达式的右边 ch 和文字字符常量用作右值 在左边 ch 用作左值
对象声明 declaration
作用是使程序知道该对象的类型和名字 它由关键字extern以及跟在后面的对象类型以及对象的名字构成
extern string fileName;
ifstream input_file( fileName );
不是定义 不会引起内存分配 实际上 它只是说明了在程序之外的某处有这个变量的定义
关于初始值
如果一个变量是在全局域[ global scope ] 内定义的 那么系统会保证给它提供初始值0 ;如果变量是在局部域 local scope 内定义的 或是通过new 表达式动态分配的 则系统不会向它提供初始值0 这些对象被称为是未初始化的 uninitialized
支持两种形式的初始化 第一种形式是使用赋值操作符的显式语法形式
int ival = 1024;
string project = "Fantasia 2000";
在隐式形式中 初始值被放在括号中
int ival( 1024 );
string project( "Fantasia 2001" );
每种内置数据类型都支持一种特殊的构造函数语法 可将对象初始化为0,例如
// 设置 ival为 0 dval为 0.0
int ival = int();
double dval = double();