(4)运算符
(1)基础运算符
-
在C++里,和数学中一样,有很多运算符,甚至比数学中还要丰富。最基础的运算符莫过于加减乘除以及取余(求模),每种运算符都用两个变量或者操作数来计算结果。运算符和操作数构成了表达式。例如:
-
int apples = 2 + 4;
-
2和4都是操作数,加号是加法运算符,4 + 2则是一个表达式,所以apples = 6。
-
加(+)减(-)乘(*)除(/)大家应该都明晓了,就不再多说了,这里讲一下取余运算符%。
-
这个程序很顺畅地说明了取余运算符的用法。比如:19 / 3 = 6,余下1,用取余运算就是:19 % 3 = 1。注意,取余运算时,两个操作数必须都是整数。而除法运算,如 19 / 3 = 6,会有小数部分,但/自动忽略了小数部分,只保留整数部分。但前提两个数都是整型。(这一过程也被称为“截断”)
赋值运算符 -
赋值运算符是等于号=。在数学中,这只是一个简单的“相等”,而在计算机中,而非如此。看下面这个:
-
a = 10;
-
这个式子表示把10赋给a,在数学中,当然可以反过来写:10 = a,但在C++中这是毫无意义的。
-
再考虑一下这个语句:i = i + 1;显然,在数学中,i左右会被消去,这是毫无意义的,但是在计算机中表示把旧的i值加上1再赋给新的i值。
介绍几个术语
-
看一下这个表达式:a = 1;
-
左值:也就是表达式的左边的变量,a,它也被称为“可修改的左值”。右值指可修改的数值,在表达式里指1。看一下下面这个程序:
-
这里,赋值的顺序是从右向左,先把1赋给c,再给b,再给a。
符号运算符
- 减号还可以标明或者改变一个值的代数符号。比如:
a = 12;
b = -a;
- 这里b的值就是-12了。这种负号称为一元运算符,它只需要一种运算对象。
(2)运算符的优先级
-
运算符优先级为表达式求值顺序提供了重要的依据,对于基础的运算符来说,计算机和数学中的运算符优先级是非常类似的,乘除先,加减后,括号里的计算比乘除还要先。比如:
-
分析一下:程序先计算圆括号内的2+5和6除3,也就成了a = b = -7 * 6 + (4 + 3 * 2);然后程序再计算圆括号内的乘法3*2,得6,再加上4,得10,成了a = b = -7 * 6 + 10;接着,程序计算-7乘6,得-42,再与10相加,得-32,也就是a = b = -32;b=-32之后,再把b的值赋给a,完成计算。
(3)其他运算符
1.递增运算符++和递减运算符–
-
还有一种运算符,之前也提到过,就是++和–运算符。a++等于a = a + 1,–同理。
-
但是++有两种形式,一前缀,即++a;一后缀,即a++区别在于递增行为发生的时间不同。请看下面的程序:
-
第一个程序中,a和b输出完全相同,让人以为在循环中,前缀和后缀毫无区别。第二个程序中我们很容易可以发现c的值还是1。可以这么理解:a++是一个运算式,a = a + 1,这个程序中的a就是左边输出的a,而c则是右边旧的a,它没有变化。而++a是一个数值,所以程序中b和d数值一样。
-
单独使用运算符时,哪种都无所谓,但在循环中最好这么写:
-
while (++a < 6)…
-
至于–运算符和++运算符极为类似,就不再赘述了。
2.sizeof和size_t运算符
-
我们在上一节就讲过sizeof运算符,它以字节为单位返回运算对象的大小。一般来说我们要用圆括号把运算对象括起来。如下:
-
sizeof返回size_t类型的值,这是一个无符号整数类型。
其实还有一些关系运算符,逻辑运算符。。。我们这里就不再多说了,以后讲到会详细介绍。
(3)小提示
- 不要自作聪明!!!不要自作聪明!!!不要自作聪明!!!重要的事情说三遍。
- 因为一次性在一个表达式中使用太多运算符会让我们糊涂,甚至会让编译器糊涂。比如:
while (num < 21)
{
cout << num << num * num++;
}
这个想法看起来很不错,先计算num的平方值,再把所得值加1。但对于C++来说,++和*的计算是同级的,编译器可能选择先+1或者选择先平方,这是不确定的,这最终会导致输出结果不同(对于不同编译器)。
- 所以要遵循以下规则,可避免类似问题:如果一个变量出现再一个函数的多个参数中,不要对该变量使用递增或者递减运算符。
- 如果一个变量多次出现在一个表达式中,不要对该变量使用递增或者递减运算符。
侵删