Java - 运算符和表达式
概念:
运算符:用于标记对数据执行某种运算的特定符号 。
操作数:参加运算的数据称为运算对象(操作数)。
分类:
按运算符的功能,将运算符分为:算术运算符、关系运算符、逻辑运算符、位运算符等
按参与运算的操作数的个数,将运算符分为:单目运算符、双目运算符、三目运算符
表达式:若干操作数(operand)和运算符(operator)按照约定规则构成的一个序列 。
算术运算符
加运算符+:连接两个字符串。例如,“abc”+12的结果为“abc12”;”abc”+1+2=? “abc”+(1+2)=?
Java语言既可对整数取模,也可以对小数取模。例如,16.2%5=1.2
char类型的数据可以进行算术运算,而boolean类型的数据不能进行算术运算。
++(--)运算符的操作数必须是变量,不能是常量或表达式 。++i 或者i++ (注意两者的区别)
关系运算符
关系运算符用于判断两个操作数的等价性和大小关系,得到的结果为布尔类型,取值为true或false。常用于逻辑判断(if语句或循环)。
逻辑运算符
逻辑运算符可以对boolean类型数据进行逻辑上的“与”、“或”、“非”、“异或”等运算,结果仍为boolean类型,通常用于程序的流程控制。逻辑运算符 &(&&)、|(||)、!
注意:运算符(&、|)和运算符(&&、||)的区别
利用&、|作运算时,运算符左右两边的表达式都会被执行,最后两表达式的结果再进行与、或运算;
而利用&&、||作逻辑运算时,如果只计算运算符左边的表达式即可确定与、或的结果,则右边的表达式
将不会执行。
位运算符
位运算符用来对整型(byte、short、int、long)或字符型(char)数据二进制位进行操作,结果为一个整数。
~(按位取反)
格式:~a功能:将操作数a中的二进制位由1变0,由0变1。
例如:int x=2; ~x=?
&(按位相与)
格式:a & b
功能:两个操作数的相应位都为1,则该位为1,否则为0。
例如, int x=2,y=7; x & y = ?
|(按位相或)
格式:a | b
功能:两个操作数的相应位中有一个为1,则该位的结果为1。例如,int x=5,y=8;
x |y = ?
^(按位相异或)
格式:a ^ b
功能:两个操作数的相应位相异,则该位的结果为1,否则为0。例如,int x=5,y=8;
x ^ y = ?
>>(按位右移)
格式:a >> b
功能:将a右移b位,右端的低位被舍弃,左端高位补原来的符号位 。例如,byte x=-6;x >>2 = ?
<<(按位左移)
格式:a << b
功能:将a左移b位,右端的低位补0,左端的高位被舍弃。例如,byte x=-6;x << 2 = ?
>>>(无符号右移)
格式:a >>> b
功能:将a右移b位,右端的低位被舍弃,左端的高位补0。例如,byte x=-6;x >>> 2 = ?
注意:移位运算时真正的移位位数不一定是指定的b位。当a为int型(或byte、short、char型)时,系统会先将b对32取模,得到的结果才是真正移位的位数,而当a为long型时,系统先将b对64取模,得到的结果作为真正的移位位数。
赋值运算符
格式:变量=表达式
double d = 7.8f; //合法
int a = 78L; //非法
int a = (int)78L; //合法
复合的赋值运算符
+= -=*= /= %= &=|= ^= >>=<<= >>>=
条件运算符
格式:表达式1 ? 表达式2 :表达式3
需注意: 表达式1应是boolean类型的表达式;表达式2和表达式3的类型要一致。
表达式
表达式(expression)是由若干操作数(operand)和运算符(operator)按照约定规则构成的一个序列。
运算符标明对操作数进行何种操作;
操作数可以是变量、常量或有返回值的方法调用等其他的表达式。
(a-b)/c+4 5>=a a>3 && a<10 10*max(a,b) a=10100
如何正确计算表达式的值?
运算符的优先级
运算符的结合性
表达式中的数据类型转换
自动类型转换
当不同类型的常量和变量在表达式中混合使用时,它们最终将被转换为同一类型,然后进行运算。为了保证精度,转换从表示数的范围较小的数据类型到表示数的范围较大的数据类型。
(byte或short)和int→int
(byte或short或int)和long→long
(byte或short或int或long)和float→float
(byte或short或int或long或float)和double→double
char和int→int
强制类型转换
格式:(目标数据类型)变量或表达式
例如,(float)5 / 9 * (f - 32)
注意:强制类型转换时,由于目标数据类型的取值范围小于待转换数据类型的取值范围,在转换过程中会出现截断,导致高位数据丢失或精度下降。
自增(自减)运算符的使用
1.输入以下代码:
public class TestIncrement
{
public static voidmain(String[] args)
{
int i = 9;
int j;
j = ++i;
System.out.println("i="+i+"\tj="+j);
}
}
2.编译 – 运行:
关系运算符的使用
1. 输入以下代码:
public class TestComparison
{
public static voidmain(String[] args)
{
int a = 4;
int b = 6;
if(a == b)
System.out.println("a等于 b");
if(a != b)
System.out.println("a不等于 b");
if(a > b)
System.out.println("a大于 b");
if(a < b)
System.out.println("a小于 b");
if(a >= b)
System.out.println("a大于等于 b");
if(a <= b)
System.out.println("a小于等于 b");
}
}
2.编译– 运行:
逻辑运算符的使用
1. 输入以下代码:
public class TestBooleanOpreator
{
public static voidmain(String[] args)
{
boolean b1,b2;
b2=false;
b1 =! b2;
System.out.println("逻辑值:b1="+b1+",b2="+b2);
System.out.println("逻辑值与:b1&b2="+(b1&b2));
System.out.println("逻辑值或:b1|b2="+(b1|b2));
System.out.println("逻辑值异或:b1^b2="+(b1^b2));
int x = 3,y = 9;
b1 = x > y&& x++ == y--;
System.out.println("短路与的结果:"+b1+",x="+x+",y="+y);
x = 3;
y = 9;
b2 = x > y &x++ == y--;
System.out.println("逻辑与的结果:"+b1+",x="+x+",y="+y);
}
}
2.编译– 运行:
位运算符的使用
1. 输入以下代码:
public class TestBitwiseOperator
{
public static voidmain(String[] args)
{
int a = 9 & 12;
int b = 9 | 12;
int c = 9 ^ 12;
int d = ~12;
System.out.print("9& 12 = "+a);
System.out.println("\t9| 12 = "+b);
System.out.print("9^ 12 = "+c);
System.out.println("\t~12= "+d);
}
}
TestBitwiseOperator
2.编译– 运行:
位运算符的综合运用
1. 输入以下代码:
public class TestMask
{
public int getOneBit(intnum, int n)
{
int i = 1 <<(n-1);
int nb = num &i;
return nb >>(n-1);
}
public static voidmain(String[] args)
{
int x = 9;
TestMask obj = newTestMask();
System.out.print(obj.getOneBit(x,4));
System.out.print(obj.getOneBit(x,3));
System.out.print(obj.getOneBit(x,2));
System.out.println(obj.getOneBit(x,1));
}
}
2.编译– 运行:
条件运算符的使用
1. 输入以下代码:
import javax.swing.JOptionPane;
public class Demo
{
public static voidmain(String[] args)
{
int score;
score =Integer.parseInt(JOptionPane.showInputDialog("请输入百分制成绩:"));
String result = (score>=60)? "及格" :"不及格";
System.out.println(result);
}
}
2.编译– 运行:
强制类型转换
1. 输入以下代码:
public class TypeConversion
{
public static voidmain(String[] args)
{
int intVar = 0xff56;
byte byteVar =(byte)intVar;
System.out.println("intVar="+Integer.toString(intVar, 2) +";" + intVar);
System.out.println("byteVar="+Integer.toString(byteVar, 2) +";" + byteVar);
}
}
2.编译– 运行: