前面讲到赋值运算符的时候,提到“x = x+7”能够被“x += 7”所取代,固然Java编程中给某个变量自加7并不常见,常见的是给某变量自加1,就像走台阶,通常都是一级一级台阶地走,犯不着一会儿跳上七级台阶。那么对于变量自加1的状况,既能够写成“x = x+1”,也能够写成“x += 1”,可是早期的Java设计师嫌前面的语句不够简洁,故而创造了新的运算符“++”,该运算符表示给变量自加1,因而“x += 1”可再简化为“x++”。同理,运算符“--”表示给变量自减1,语句“x--”等价于“x -= 1”和“x = x-1”。为深刻理解“++”与“--”这两个运算符的做用,不妨运行下面的演示代码观察结果:java
int x = 3; System.out.println("初始 x="+x); x++; // 等同于x=x+1或者x+=1 System.out.println("自增1 x="+x); x--; // 等同于x=x-1或者x-=1 System.out.println("自减1 x="+x);
既然有了自增1运算“++”和自减1运算“--”,那末有没有自乘运算“**”和自除运算“//”呢?很遗憾Java不存在所谓的自乘与自除,假若自乘运算指的是求某整型变量的平方,仍是老老实实地写如下代码“x = x*x”或者“x *= x”;假若自除运算指的是求某整型变量的倒数,也要老老实实地写如下代码“double y = 1.0/x”。求平方与求倒数的代码以下所示:编程
// 没有“**”这个运算符,求平方仍是按照常规写法 x *= x; // 也能够写成x = x*x System.out.println("求平方 x="+x); // “//”已经被用做注释标记了,求倒数也得按照常规写法,并且整数的倒数只能是小数 double y = 1.0/x; // 注意这里的1.0/x,因为x是整型数,所以1/x没法求得小数 System.out.println("求倒数 y="+y);
因为“++”和“--”从头至尾只有变量自身参与运算,并没有其它的操做数,所以又被称做一元运算符。相似的一元运算符还有负号运算符“-”和正号运算符“+”,这两个符号其实也来源于数学,都放在数字前面,好比“-1”表示负一,“+1”表示正一。但在Java编程当中,变量前面的正负号概念有所不一样,例如“-x”指的是对x作负号运算,“x = -x”等价于“x = 0-x”。假若整型变量x原来是正值,则负号运算的结果为负值;但若x原来是负值,则负号运算的结果变为正值,也就是所谓的负负得正。至于“x = +x”等价于“x = 0+x”,显然正号运算的结果与原值相同,正值的正号运算结果仍为正值,负值的正号运算结果仍为负值,而非数学上的正号意义。要想验证上述的正负运算符,可运行下列代码观察测试结果。测试
x = -x; // 等同于x=0-x System.out.println("负数 x="+x); x = +x; // 等同于x=0+x System.out.println("正数 x="+x);
注意到上面的正负运算符直接放在变量以前,实际上“++”和“--”也容许放在变量前面,单独的“++x”等价于“x++”,单独的“--x”等价于“x--”。之因此特别强调“单独”二字,是由于一旦它们放到了其余语句之中,运算结果就将大不相同。譬以下述代码演示了两者之间的区别:设计
int y1 = 7; int z1 = y1++; // 后加加操做的优先级较低 System.out.println("z1="+z1); int y2 = 7; int z2 = ++y2; // 前加加操做的优先级较高 System.out.println("z2="+z2);
运行上面的演示代码,会获得下面的日志信息。日志
z1=7 z2=8
可见此时z1的数值不等于z2,究其缘由,乃是前加加与后加加的运行机制差别所致。对于“int z1 = y1++;”,该语句在执行时会分解成下列两个步骤:先执行对z1的赋值操做,再执行对y1的自增操做。此时最终的运行步骤如同如下代码:blog
int z1 = y1; y1 = y1+1;
对于“int z2 = ++y2;”,该语句在执行时也会分解成下列两个步骤:先执行对y1的自增操做,再执行对z1的赋值操做。此时最终的运行步骤如同如下代码:数学
y2 = y2+1; int z2 = y2;
其实这种状况很好理解,计算机语言跟人类文字的书写顺序同样,都是从上到下、从左往右。定睛一看“x++”,果真先看到变量x,接着才看到自增运算++;回头再瞅“++x”,这下先看到自增运算,而后才看到变量x。同是书面文字,计算机语言和人类语言的语法逻辑大抵相同。
最后来个脑筋急转弯,现有变量z1值为7,变量z2值为8,那么且看下面代码的运算结果,变量z3的数值又该为什么?有兴趣的朋友不妨一试。class
int z3 = ++z1+z2++;