第2章 数据类型与表达式

1.在一个整形常量后面加一个字母l或L,则认为是long int型常量。如果函数的形参为long int,则要求实参也为long int型,此时用123实参不行,而要用123L作实参。
2.八进制整数在常数的开头加一个数字0,十六进制整数在常数的开头加一个数字0和一个英文字母X(或x)。八进制转义字符由\和1-3个八进制数字构成.十六进制转义字符由\和字母x(注意:X不能识别)以及1-2个
3.在Visual C++6.0中,对float提供6位有效数字,对double提供15位有效数字。对float分配4个字节,对double和long double分配8个字节。因此在Visual C++ 6.0中,实际用不到long double类型,在GCC中则对long double分配12个字节。
4.如果在实数的数字之后加字母F或f,表示此数为单精度浮点数。如果加字母L或l,表示此数为长双精度数,在GCC中占12个字节,在Visual C++6.0中占8个字节。不加字母则按双精度处理占8个字节。

5.在程序中不论把浮点数写成小数形式还是指数形式,在内存中都是以指数形式存储的。例如不论在程序中写成314.159或314.159e0,31.40159e1等形式,在内存中都是以规范化的指数形式存放。


数字部分必须小于1,同时,小数点后面第一个数字必须是一个非0数字。对于以指数形式表示的数值常量,也都作为双精度常量处理。
6.字符常量只能包括一个字符,如'AB'是不合法的。
7.在一定条件下,字符型数据和整型数据是可以通用的。但是应注意字符数据只占一个字节,它只能存放0~255范围内的整数。

8.如果在一个字符串中最后一个字符为“\”,则表示它是续行符,下一行的字符是该字符串的一部分,且在两行字符串间无空格。


9.符号常量虽然有名字,但它不是变量。它的值在其作用域内是不能改变的,也不能被赋值。定义方法:#define PRICE 40
10.变量名代表内存中的一个存储单元,在对程序编译连接时同系统给每一个变量分配一个地址。在程序中从变量中取值,实际上是通过变量名找到相应的内存单元,从其中读取数据。
11.C++没有规定标识符的长度,但各个具体的C编译系统都有自己的规定。有的系统取32个字符,超过的字符将不能被识别。
12.C语言要求变量的定义应该放在所有的执行语句之前,而C++则放松了限制,只要求在第一次使用该变量之前进行定义即可。
13.每一个变量被指定为一确定类型,在编译时就能为其分配相应的存储单元。如指定a和b为int型,一般的编译系统对其分配4个字节,并按整数方式存储数据。

14.指定每一个变量属于一个特定的类型,这就便于在编译时,据此检查该变量所进行的运算是否合法。例如,整型变量a和b,可以进行求余运算;如果将a和b指定为实型变量,则不允许进行“求余”运算。

15.如果对变量未赋初值,则该变量的初值是一个不可预测的值。

16.初始化不是在编译阶段完成的(只有静态变量和全局变量初始化是在编译阶段完成的),而是在程序运行时执行本函数时赋予初值的,相当于执行一个赋值语句。如:int a=3;相当于int a; a=3;
17.在定义常量时,如果加上关键字const,则变量的值在程序运行期间不能改变,这种变量称为常变量。如:const int a=3;const加在数据类型前后均可.
18.在定义常变量时必须同时对它初始化,此后它的值不能再改变。常变量不能出现在赋值号的左边。例如上面一行不能写成const int a; a=3;
19.可以用表达式对常变量初始化,如:const int b=3+6;c=3*cos(1.5);//b,c均为常变量。由于使用了系统标准数学函数cos,必须包含该函数有关的信息的头文件"cmath"或math.h包含到本程序单位中来。
20.从计算机实现的角度看,变量的特征是存在一个以变量名命名的存储单元,存储单元中的内容是可以变化的,对常变量来说 ,无非在此变量的基础上加上一个限定:存储单元中的值不允许变化。
21.请区别用#define命令定义的符号常量和用const定义的常变量。符号常量只是用一个符号代替一个字符串,在预编译时把所有符号常量替换为所指定的字符串;它没有类型,在内存中并不存在以符号常量命名的存储单元。而常变量具有变量的特征,它具有类型,在内存中存在着以它命名的存储单元,可以用sizeof运算符测出其长度。与一般变量惟一不同是指定变量的值不能改变。用#define命令定义符号常量是C语言所采用的方法,C++把它保留下来是为了和C兼容。C++的程序员一般喜欢用const定义常变量。

22.两个整数相除的结果为整数,如5/3的结果值为1,舍去小数部分。但是如果除数或被除数中有一个为负值,则舍入方向是不固定的。多数编译系统采取“向零取整”的方法,即-5/3的值为-1.

23.取模运算符%的两个操作对象都必须是整数.结果的符号与%左边的操作数的符号相同.如20%6的结果为2,-45%8的结果为-5,45%-8的结果为5.

24.

图中横向向左的箭头表示必定的转换,纵向的箭头表示当运算对象为不同类型时转换的方向。如果一个int型数据与一个double型数据运算,是直接将int型转成double型。

25.自增运算符和自减运算符只能用于变量,而不能用于常量或表达式,如5++和(a+b)++都是不合法。

26.-i++应理解成-(i++),因为后置++(或--)优先级高于负号运算符。前置++(或--)跟负号运算符优先级相同,但是由于“从右向左”结合,---i应理解为-(--i)

27.许多编译系统(包括Visual C++6.0和GCC)在处理输出流时,先按自右向左的顺序对各输出项求值 


28.


大多数C++系统把3作为表达式中所有i的值,因此3个i相加,得到表达式的值为9。在求出整个表达式的值后再实现自加3次,i的值变为6。

29.如果要进行强制类型转换的对象是一个变量,该变量可以不用括号括起来,如果要进行强制类型转换的对象是一个包含多项的表达式,则表达式应该用括号括起来。(int)(x+y)

30.(int)x如果x原指定为float型,值为3.6,进行强制类型运算后得到一个int型的中间变量,它的值等于3,而x的原来的类型和值都不变。

31.赋值运算符右边值的类型与左边变量的类型不一致,以左边变量的类型为准.

32.将浮点型数据赋给整型变量时,舍弃其小数部分。如i为整型变量,执行"i=3.56"的结果使i的值为3,在内存中以整数形式存储。

33.将整型数据赋给浮点型变量时,数值不变,但以指数形式存储在变量中。

34.将字符型数据赋给整型变量时,由于字符型 数据只占1个字节,而整型占4个字节,如果所用系统将字符处理为无符号的量,高位将补0,如果所用系统将字符处理为带符号的量(signed char),则进行符号扩展.

35.将带符号的整型赋给长整型时(长整型带不带符号不影响内存内容),也需要进行符号扩展

36.(a=3*5)=4*3,实际上是将4*3的积12赋给变量a,而不是赋给3*5。正因为这样,赋值表达式才能够作为左值。赋值表达式的值就是被赋值变量的值.
37.用cout语句输出一个赋值表达式的值时,要将该赋值表达式用括号括起来,cout<<(a=b);如写成cout< 38.表达式1,表达式2——逗号表达式的求解过程是:先求解表达式1,再求解表达式2。整个逗号表达式是表达式2的值。

39.在用cout输出一个逗号表达式的值时,要将逗号表达式用括号括起来,如:cout<<(3*5,43-6*5,67/3)<

40.条件表达式中,表达式2和表达式3不仅可以是算术表达式,还可以是赋值表达式或函数表达式.表达式1的类型可以与表达式2和表达式3的类型不同.表达式2和表达式3的类型也可以不同,此时条件表达式的值的类型为二者较高的类型.

41.在右移时,要注意符号位问题.如果移位对象是无符号数,那么右移时左边空出来的位全以0填充,这种方式称为逻辑右移方式;如果移位对象是有符号数,当移位对象是正数(符号位为0)时,左边空位用0填充;当移位对象是负数(符号位为1)时,左边空位是补0还是补1,要取决于所用的计算机系统.有的系统按逻辑右移方式(即补0)处理,有的系统则按算术右移方式(即补1)处理.VC6.0按算术右移处理.

42.两个长度不同的数据进行位运算的时,系统会按二者右端对齐.如果是无符号数,补0.如果是有符号数,进行符号扩展.

43.位逻辑运算符&,|和^两个运算分量是可交换的;而逻辑运算符^^和||的两个运算分量是不可交换的.并且它们严格执行自左至右的运算.下面看个例子:

int x,y,z;

x=y=z;

--x && ++y || z++;

最后x,y,z的值为何?

分析一下,由于运算符&&的优先级高于运算符||,所以运算顺序自左至右,因而先做--x,其结果是:x的值变为0.这样,"--x && ++y"表达式的结果就已确定,所以++y不再执行,y的值仍然为1;但对于运算符||来说,左分量为0,尚不能确定整个逻辑表达式的值,帮执行其右边的表达式z++,最后z值变为2.




你可能感兴趣的:(《C++程序设计》读书笔记,存储,float,math.h,gcc,扩展,c)