算法竞赛宝典(第一部):语言及算法入门
上QQ阅读APP看书,第一时间看更新

运算规则

整型和实型数据可以混合运算,并且由于字符型数据可以与整型通用,因此,整型、实型、字符型数据间可以混合运算。例如,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;