递增、递减与指定运算子,老实说常成为初学者的一个恶梦,因为有些程序中若写得精简,这几个运算子容易让初学者搞不清楚程序的真正运算结果是什么;事实 上,使用这几种运算子的目的除了使让程序看来比较简洁之外,还可以稍微增加一些程序执行的效率。
在程序中对变量递增1或递减1是很常见的运算,例如:
int i = 0; i = i + 1; System.out.println(i); i = i - 1; System.out.println(i);
这段程序会分别显示出1与0两个数,您可以这么写这个程序:
int i = 0; System.out.println(++i); System.out.println(--i);
其中写在变量 i 之前的++与--就是「递 增运算子」(Increment operator)与「递减运算子」(Decrement operator),当它们撰写在变量之前时,其作用就相当于将变量递增1与递减1:
++i;// i = i + 1; --i;// i = i - 1;
您可以将递增或递减运算子撰写在变量之前或变量之后,但其实两者是有差别的,将递增(递减)运算子撰写在变量前时,表示先将变量的值加(减)1,然后再传 回变量的值,将递增(递减)运算子撰写在变量之后,表示先传回变量值,然后再对变量加(减)1,例如:
int i = 0; int number = 0; number = ++i;// 相当于i = i + 1; number = i; System.out.println(number); number = --i;// 相当于i = i - 1; number = i; System.out.println(number);
在这段程序中,number的值会前后分别显示为1与0,再看看下面这段:
int i = 0; int number = 0; number = i++;// 相当于number = i; i = i + 1; System.out.println(number); number = i--;// 相当于 number = i; i = i - 1; System.out.println(number);
在这段程序中,number的值会显示前后分别为0与1。
接下来看「指定运算子」(Assignment operator), 到目前为止只看过一个指定运算子,也就是(=)这个运算子,事实上指定运算子还有以下的几个:
运 算子 |
范 例 |
结 果 |
+= |
a += b |
a = a + b |
-= |
a -= b |
a = a - b |
*= |
a *= b |
a = a * b |
/= |
a /= b |
a = a / b |
%= |
a %= b |
a = a % b |
&= |
a &= b |
a = a & b |
|= |
a |= b |
a = a | b |
^= |
a ^= b |
a = a ^ b |
<<= |
a <<= b |
a = a << b |
>>= |
a >>= b |
a = a >> b |
每个指定运算子的作用如上所示,但老实说若不是常写程序的老手,当遇到这些指定运算子时,有时可能会楞一下,因为不常用的话,这些语法并不是那么的直觉。
使用++、--或指定运算子,由于程序可以直接在变量的内存空间中运算,而不用取出变量值、运算再将数值存回变量的内存空间,所以可以增加运算的效 率,但以现在计算机的运算速度来看,这一点的效率可能有些微不足道,除非您这类的运算相当的频繁,否则是看不出这点效率所带来的改善,就现在程序撰写的规模 来看,程序的易懂易读有时反而是重点,可以的话尽量将程序写的详细一些会比较好,千万不要为了卖弄语法而滥用这些运算子。
就单一个陈述而言,使用++、--或指定运算子是还算可以理解,但与其它陈述结合时可就得考虑一下,例如:
int i = 5; arr[--i %= 10] = 10;
像这样的式子,要想知道 i 是多少,以及数组的指定索引位置在哪可就得想一下了(有兴趣算一下的话,i会是4,而数组的指定索引也是4),总之,如何使用与何时使用,自己得拿捏着点