左值和右值
虽然它的定义和C语言风格不太符合。左值就是可以出现在赋值号左边的东西,右值就是可以出现在赋值号右边的东西。
左值必须可以预料到存储结果的地址才能成为左值,而右值应该是个可以预料到它的值的东西。
隐式类型转换和算术转换
隐式类型转换:
C的整型运算总是至少以缺省整数类型的精度进行的。
char a,b,c;
…
a = b + c;
b和c的值被提升为缺省整型,再执行加法运算。运算结果是个缺省整形,会被截短,保留低8位,存储于a中。
算术转换:
若某个操作符的各操作数属于不同的类型,除非其中一个操作数转换为另一个操作数类型,否则操作无法进行。
寻常算术转换:
long double >double > float > unsigned long int > long int > unsigned int >int
如果某个操作数的类型排名较低,那么它首先转换为另一个操作数的类型然后执行操作。
较为常见的问题就是涉及到int和float运算的时候。比如:
float x;
int a = 2, b =4;
x = a / b;
你得到的数值肯定不是你想要的0.5。理想的方式是x = (float)a/b;或者将两个操作数全部转换为float类型。
还有一个问题就是计算结果溢出。比如
int a = 60000, b= 60000;
int c = a * b;
long d = a * b;
两种方法都不会得到正确结果。
a * b的结果是个int型数值。int c = a * b;时结果溢出。long d = a * b;时赋给c的值是一个由int转型为long的数据,相当于是long d = c;处理方式同上long d = (long)a * b;
虽然它的定义和C语言风格不太符合。左值就是可以出现在赋值号左边的东西,右值就是可以出现在赋值号右边的东西。
左值必须可以预料到存储结果的地址才能成为左值,而右值应该是个可以预料到它的值的东西。
隐式类型转换和算术转换
隐式类型转换:
C的整型运算总是至少以缺省整数类型的精度进行的。
char a,b,c;
…
a = b + c;
b和c的值被提升为缺省整型,再执行加法运算。运算结果是个缺省整形,会被截短,保留低8位,存储于a中。
算术转换:
若某个操作符的各操作数属于不同的类型,除非其中一个操作数转换为另一个操作数类型,否则操作无法进行。
寻常算术转换:
long double >double > float > unsigned long int > long int > unsigned int >int
如果某个操作数的类型排名较低,那么它首先转换为另一个操作数的类型然后执行操作。
较为常见的问题就是涉及到int和float运算的时候。比如:
float x;
int a = 2, b =4;
x = a / b;
你得到的数值肯定不是你想要的0.5。理想的方式是x = (float)a/b;或者将两个操作数全部转换为float类型。
还有一个问题就是计算结果溢出。比如
int a = 60000, b= 60000;
int c = a * b;
long d = a * b;
两种方法都不会得到正确结果。
a * b的结果是个int型数值。int c = a * b;时结果溢出。long d = a * b;时赋给c的值是一个由int转型为long的数据,相当于是long d = c;处理方式同上long d = (long)a * b;



