运算规则
整型和实型数据可以混合运算,并且由于字符型数据可以与整型通用,因此,整型、实型、字符型数据间可以混合运算。例如,134+'a'+3.4-45.8*'c'是合法的。
但在运算时,系统会自动将不同类型的数据转换成同一类型的数据,然后再进行运算。转换的规则由小到大如图1.24所示:
图1.24
计算机运算次序为由左到右,如10+'a'+int*float-double/long:
(1)进行10+char的运算,先将char转换成整数,得结果为107;
(2)由于*比+优先,先进行int*float的运算。将两数都转为double型;
(3)107与int*float的积相加,先将整数转为双精度数。结果为double型;
(4)将变量long转化为double型,double/long的结果为double型;
(5)将10+'a'+int*float的结果与double/long的商相减,结果为double型。
C++语言还规定了运算符的优先级和结合性,在表达式求值时,先按运算符的优先级别高低次序执行,例如先乘除后加减。如果一个运算对象两侧的运算符的优先级别相同,如a-b+c,则按规定的“结合方向”处理。
算术运算符的结合方向为“先左后右”,“先左后右”又称“左结合性”。以后还可以看到有些运算符的结合方向为“自右向左”,即右结合性(例如,赋值运算符)。
C++语言的优先级和结合性是一个很重要的概念,特别是关于“结合性”的概念在其他一些高级语言中是没有的。
C++的运算符及其优先级请参见附录。
可以利用强制类型转换运算符将一个表达式转换成所需的类型。例如:
(double)a (将a转换成double型) (int)(x+y) (将x+y的值转为int型) (float)(4%3) (将4%3的值转换成float型)
请看一个强制类型转换的例子:
1 //强制类型转换 2 #include <iostream> 3 using namespace std; 4 5 int main() 6 { 7 float x=3.84; 8 int i; 9 i=(int)x; //将float类型强制转成int类型 10 cout<<i<<endl; 11 system("pause"); 12 return 0; 13 }
运行结果如下:
x=3.84 i=3
由此可见,通过强制转换,原float型的整数部分不变,而小数部分被“丢弃”。
C++有两种转换,一种是系统自动进行的类型转换,如3+3.4。另一种是强制类型转换。当自动类型转换不能实现目的时,可以用强制类型转换。如“%”运算符要求其两侧均为整型量,若x为float型,则“x%3”不合法,必须用“(int)x%3”。由于强制类型转换运算优先级高于%运算,因此先进行强制转换再对3求模。
类似于(int)(x+y)这样的表达式必须用括号括起来,如果写成(int)x+y,则只将x转换为整型,然后与y相加。
在后面学到函数调用时,有时为了使实参与形参类型一致,可以用强制类型转换运算符得到一个所需类型的参数。
C++的自增自减运算符++和--的作用是使变量的值增1或减1,如:
++i,--i(在使用i之前,先使i的值加(减)1)
i++,i--(在使用i之后,使i的值加(减)1)
++和--只能用于变量,而不能用于常量或表达式,如5++或(a+b)++都是不合法的。
++和--的结合方向是“自右至左”。
粗略地看,++i和i++的作用相当于i=i+1,但它们的不同之处在于++i是先执行i=i+1后,再使用i的值;而i++是先使用i的值后,再执行i=i+1。如果i的原值等于3,则执行下面的赋值语句:
(1)j=++i;(i的值先变成4,再赋给j,j的值为4)
(2)j=i++;(先将i的值3赋给j,j的值为3,然后i变为4)
例如:
i=3; cout<<++i; 输出“4”。若改为cout<<i++; 则输出“3”。
又如:
i=1; i=(++i)+(++i); cout<<i; 该结果为6,因为最后i的值为3,3+3=6。
另外,一般情况下++i的运行速度要略快于i++,这涉及到编译原理。
赋值符号“=”就是赋值运算符,它的作用是将一个数据赋给一个变量。
在赋值符“=”之前加上其他运算符,称为复合运算符,例如“+=”。其含义如下面各例:
a+=3 等价于a=a+3
x*=y+8 等价于x=x*(y+8)
x%=3 等价于x=x%3
C++语言采用这种复合运算符,一是为了程序的精练;二是为了提高编译效率(此处涉及编译原理的知识,暂不必深究)。
注意:如果是包含若干项的表达式,则相当于它有括号,如:
x%=y+4相当于x%=(y+4),即x=x%(y+4)
而不是x=x%y+4
C++语言提供一种特殊的运算符——逗号运算符,用它将两个表达式连接起来,如:
3+5,6+8
称为逗号表达式,又称为“顺序求值运算符”。逗号表达式的求解过程是:先求解表达式1,再求解表达式2。整个逗号表达式的值是表达式2的值。
我想起我们前面定义变量时已经使用过逗号表达式了,如:
int a,b=0,c,d=34; double x,y,z;