1.引言
- Java的基本算数操作符与其他大多数程序设计语言是相同的。包括加(+)、减(-)、乘(*)、除(/,注意:"/"运算会直接去掉结果的小数位,而不是四舍五入地得到圆整结果)以及取模运算(%,即取从整数除法中产生的余数)。
- Java也使用一种来自C和C++的简化符号同时进行运算与赋值操作。这就用操作符后紧跟一个等号来表示,它对于Java中的所有操作符都适用,只要有实际意义就行。eg:将i加5,并将结果赋回给i,可以这么写:i + = 5。
2.各种运算符描述
-
2.1一元加、减操作符
- 一元加(+)和一元减(-)和二元加号和减号都使用相同的符号。根据表达式的书写形式,编译器会自动判断出使用的是哪一种。
eg:1 i = -a; //将 i - a再赋回给i 2 i = a * -b; //编译器可以正确识别此语句 3 i = a * (-b); //此语句等同于语句2
- 一元减号用于转换数据的符号,而一元加号只是为了与一元减号相对应,但是它唯一的作用仅仅是将较小数据类型(byte、char、short)的操作数(自动)提升为int型再进行运算。
- 一元加(+)和一元减(-)和二元加号和减号都使用相同的符号。根据表达式的书写形式,编译器会自动判断出使用的是哪一种。
-
2.2自动递增和递减
- Java提供了大量的快捷运算。这些快捷运算时编码更加方便,同时也使得代码更容易阅读和理解,但世事无绝对,有时也会使得代码阅读起来更加困难。
- 递增和递减运算符
- 递增和递减运算是两种相当不错的快捷运算。"- -“意为"减少一个单位”;"++“意为"增加一个单位”。
eg:
/*递增和递减操作符不仅改变了变量,并且以变量的值作为其生成的结果 */ 1 int i = 1; 2 ++i; //等价于i = i + 1; 3 --i; //等价于i = i - 1;
- 递增和递减操作符的两种使用方式:前缀式和后缀式。
前缀式++i、- -i :会先执行运算,再生成值。
后缀式i++、i- - :会先生成值,再执行运算。
递增递减运算归纳:从上数运算结果可以看出,对于前缀式,我们在执行运算后才得到值,而对于后缀式,则是在运算执行之前就得到值。它们是除那些涉及赋值的操作符以外唯一具有“副作用”效果的操作符。1 int i = 1; 2 int j = 1; 3 System.out.println("i="+ ++i); // 输出结果为i=2 4 System.out.println("j="+ j++); //输出结果为j=1 5 System.out.println("j="+ j); //输出结果为j=2 /* --和++的前缀和后缀式运算规则一样,这里就不做赘述*/
- 递增和递减运算是两种相当不错的快捷运算。"- -“意为"减少一个单位”;"++“意为"增加一个单位”。
-
2.2关系操作符
- 常见的关系运算符包括大于(>)、小于(<)、等于(==)、大于等于(>=)、小于等于(<=)、不等于(!=)。它们生成的结果是一个boolean(布尔)类型,如果关系是"正确的"则结果为true(真),如果关系"不正确"则结果为false(假)。 注意:等于和不等于适用于所有的基本数据类型,而其他比较符不适用与boolean类型。因为boolean值只有 true 或 false(默认值),"大于"和"小于"没有实际意义。
这里的==运算会涉及到比较内容和比较对象引用。就不得不提到equals方法了。两者之间的关系并不是本文的重点,日后会在其他文章做详细阐述。
- 常见的关系运算符包括大于(>)、小于(<)、等于(==)、大于等于(>=)、小于等于(<=)、不等于(!=)。它们生成的结果是一个boolean(布尔)类型,如果关系是"正确的"则结果为true(真),如果关系"不正确"则结果为false(假)。 注意:等于和不等于适用于所有的基本数据类型,而其他比较符不适用与boolean类型。因为boolean值只有 true 或 false(默认值),"大于"和"小于"没有实际意义。
-
2.3逻辑操作运算符
-
逻辑操作符"与"(&&)、“或”(||)、“非”(!)、可以根据参数的逻辑关系生成一个布尔值。
&&:又称短路与,在(a && b)中,要求a和b都为true时(a && b)整体才为true
||:又称短路或,在(a || b)中,只要a或b有一个为true时(a || b)整体就为true1 int i = 55; 2 int j = 65; 3 System.out.println("(i<60)&&(j<60) is" + " " + ((i < 60) && (j < 60))); //输出结果为((i<60)&&(j<60)) is false 4 System.out.println("(i<60)||(j<60) is" + " " + ((i < 60) || (j < 60))); //输出结果为((i<60)||(j<60)) is true 5 System.out.println("(i != j) is" + " " + (i != j)); //输出结果为(i != j) is true
在上述的代码中,可将int类型替换成除boolean类型以外的其他任何基本数据类型(byte、char、short、float、double、long)。但要注意的是,对于浮点数的比较时非常非常非常严格的。即使一个数仅在小数部分和另一个数存在极其微小的差异,仍然认为它们是不等的。
注意:“与”、“或”、"非"操作只可应用与布尔值。不可以将一个非布尔值当作布尔值在逻辑表达式中使用。 -
短路
当使用逻辑操作符时,我们会遇到一种"短路"现象。即一旦能够明确无误地确定整个表达式的值(true或false),就不再计算表达式余下部分。实际上,如果所有的表达式都有一部分不必计算,那将获得潜在的性能提升。
-
-
2.4移位操作符
- 移位操作符操作的对象是二进制的"位"。移位操作符只可用来处理int类型。左移位操作符"<<“能按照操作符右侧指定的位数将操作符左边的操作数向左移动(在低位补0),“有符号” 右移位操作符”>>"则按照操作符右侧指定的位数将操作符左边的操作数向右移动
注意:如果对于char、byte和short类型的数值进行移位处理时,在移位进行之前,它们会被转化成int类型,并且最终得到一个int类型的结果,这和在执行运算符"+"是一样的。只有数值右端的低5位才有用(long类型为6位)。这样可以防止我们移位超过int类型值所具有的位数(2的5次方为32,而int型值只有32位)。1 int i = 80; 2 int j = 80; 3 System.out.println(Integer.toBinaryString(i)); //输出结果为80的二进制数1010000 4 System.out.println(i>>3); //输出结果为10 5 i>>=3; //将i的值向右移动3位并赋给i; 6 System.out.println(Integer.toBinaryString(i)); //输出结果为10的二进制数1010 7 System.out.println(i<<3); //输出结果为640 8 j<<=3; //将j的值向左移动3位并赋给j; 9 System.out.println(Integer.toBinaryString(j)); //输出结果为640的二进制数1010000000
- "移位"可与"等号"组合使用(<<=或>>=)。此时,操作符左边的值会移动到由右边的值指定的位数,再将得到的结果赋给左边的变量。
- 移位操作符操作的对象是二进制的"位"。移位操作符只可用来处理int类型。左移位操作符"<<“能按照操作符右侧指定的位数将操作符左边的操作数向左移动(在低位补0),“有符号” 右移位操作符”>>"则按照操作符右侧指定的位数将操作符左边的操作数向右移动
-
2.5其他操作符
后续更新
3.归纳
- 如果对基本数据类型执行算数运算或按为运算时,只要类型比int小的,那么在运算之前,这些值会自动转换成int型,且最终生成的结果就位int型。而当把结果赋值给较小的类型时,就必须进行强制类型转换(使用是要谨慎,可能会出现信息丢失)。通常 表达式中出现的最大数据类型决定了表达式最终的数据类型。如果将一个float值与一个doube值相乘,结果就是double。