Java之操作符
write:2022-5-11
前文我们学习了java的变量:Java之变量的作用域和初始化,本文学习java的操作符。
文章目录- 1. 操作符和表达式的概念
- 2. 操作符的优先级
- 2.1 一元操作符
- 2.2 二元整型操作符
- 2.3 浮点型操作符
- 2.4 复合赋值操作符
- 2.5 比较操作符
- 2.6 逻辑操作符
- 3. 字符串操作符
- 4. 特殊操作符“?:”
- 5. 变量的赋值和类型转换
- 6. 练习题
什么是操作符,什么是表达式,举例说明:
int a=1;
int b=2;
int c=a+b;
其中,“a+b”是表达式,“+”是操作符,a和b是操作符“+”的两个操作元。
操作符及操作符优先级:
下面进行详讲:
- 取反符号
eg:
int k=10;
int m=~k; //m=-11
- “++”和“–”既可作为前置操作符,也可作为后置操作符。
eg:
int x=0,y=0,i=2,j=2;
i=x++; //“++”作为后置操作符,i的值变为0,x的值变为1
j=++y; //“++”作为前置操作符,y的值变为1,j的值变为1
-
/(除运算取商)与%(模运算取余)
eg:
int a =13/5; //a=2
int b=13%5; //b=3 -
Java语言支持整数类型数据的位运算,位运算操作符包括:
“&”:与运算,对两个操作元的每个二进制位进行与运算,运算规则为:1&1→1,1&0→0,0&1→0,0&0→0。
“ ^ ”:异或运算,对两个操作元的每个二进制位进行异或运算,运算规则为:1 ^ 1→0,1 ^ 0→1,0 ^ 1→1,0 ^ 0→0。
“|”:或运算,对两个操作元的每个二进制位进行或运算,运算规则为:1|1→1,1|0→1,0|1→1,0|0→0。
“ ~ ”:取反运算,对操作元的每个二进制位进行取反运算,运算规则为:~ 1→0,~ 0→1。
“>>”:算术右移位运算。
“>>>”:逻辑右移位运算。
“<<”:左移位运算。 -
“&”操作符
eg:
int a1=12&5; //a1=4
-
“>>”算术右移位操作符
eg:
int a1= 12 >>1; //变量a1的取值为6
int a2=-12 >> 2; //变量a2的取值为-3
-
“>>>”逻辑右移位操作符
操作符“>>>”是逻辑右移位操作符,也称为不带符号右移位操作符,在移位的过程中,二进制的开头增加的位都是0。
eg:
int a1= 12 >>>1; //变量a1的取值为6
现在,动手试一试int a2=-12 >>>2;
答案://变量a2的取值为1073741821 -
“<<”算术左移位操作符
在移位的过程中,二进制的后面增加的位都是0。
int a1= 12 << 1; //变量a1的取值为24
int a2=-12 << 2; //变量a2的取值为-48
多数整型操作符也可作为浮点型操作符,如“++”、“–”、“+”、“–”、“*”和“/” 等。
int int1=1,int2=1;
long long1=1,long2=1;
float float1=1.0F,float2=1.0F;
double double1=1.0,double2=1.0;
int result1=int1int2; //运算结果为int类型
long result2=int1int2+long1; //运算结果为long类型
float result3= int1int2+long1+float1/float2; //运算结果为float类型
double result4= int1int2+long1+float1/float2+double1; //运算结果为double类型
算一算:
int a=13/5; //a=2
double b=13/5; //b=2.0
double c=13/5.0; //c=2.6
类复合赋值操作符,例如:
j - = i;
这里的“-=”由操作符“-”和“=”复合而成,它等价于j=j-i,这种复合方式适用于所有的二元操作符,复合操作符能使程序变得更加简洁:
a+=b; 等价于: a=a+b;
a*=b; 等价于: a=a*b;
a/=b; 等价于: a=a/b;
a%=b; 等价于: a=a%b;
int a=1,b=1;
double d=1.0;
boolean result1=a>b; //result1的值为false
boolean result2=a boolean result3=a>=d; //result3的值为true
boolean result4=a<=d; //result4的值为true
- 与操作符的运算规则
- 或操作符的运算规则
- 短路(short circuit)操作符和非短路操作符
“&&”和“||”是短路(short circuit)操作符,“&”和“|”是非短路操作符,它们的区别是:
(1)对于短路操作符,如果能根据操作符左边的布尔表达式就能推算出整个表达式的布尔值,将不执行操作符右边的布尔表达式。
(2)对于非短路操作符,始终会执行操作符两边的布尔表达式。
对于“&&”操作符,当左边的布尔表达式的值为false时,整个表达式的值肯定为false,此时会忽略执行右边的布尔表达式,例如:
int output=10;
boolean b1 = false;
if((b1==true) && ((output+=10)==20)){
System.out.println("We are equal! "+output);
}else{
System.out.println("Not equal! “+output);
}
以上程序的输出结果为"Not equal! 10”。
int output=10;
boolean b1 = false;
if((b1==true) & ((output+=10)==20)){
System.out.println("We are equal! "+output);
}else{
System.out.println("Not equal! "+output);
}
这段程序的打印结果为“Not equal! 20”。
String s1= " Hello"+ “World”; //s1= “HelloWorld”
String s2=“Age:”+1; //s2= “Age:1”
String s3=“Answer :” +true; //s3= “Answer:true”
算一算下列表达式:
//s4= “6112411”
String s4=5+1+“1”+new Integer(1)+ 2 +4+ new Long(11);
表达式的执行步骤如下:
(1)5+1 →6 //数学加法操作符
(2)6+“1” →"61" //字符串连接操作符
(3)“61”+new Integer(1) →"611" //字符串连接操作符
(4)“611”+2 →"6112" //字符串连接操作符
(5)“6112”+4 →"61124" //字符串连接操作符
(6)“61124”+new Long(11) →"6112411" //字符串连接操作符
布尔表达式 ? 表达式1 : 表达式2
操作符“?:”的运算过程为:如果布尔表达式的值为true,就返回表达式1的值,否则返回表达式2的值。
例如:
int score=61;
String result=score>=60 ? “及格” : “不及格”;
因此result的值是“及格”;
同种类型的变量之间赋值时,不需要进行类型的转换。
当不同类型的变量之间赋值时,需要类型转换。
类型转换可分为自动类型转换和强制类型转换两种。
(1)自动类型转换
自动转换是指运行时,Java虚拟机自动把一种类型转换成另一种类型,例如以下赋值会自动进行类型转换:
char c=‘a’;
int i=c; //把char类型变量c赋值给int类型变量i
int j=‘a’; //把char类型直接数’a’赋值给int类型变量j
整型、浮点型、字符型数据可以进行混合运算。当类型不一致时,需要进行类型转换,从取值范围小的类型到取值范围大的类型会进行自动转换。
byte→ short→ int→long→float→ double
byte→char→ int→long→float→ double
eg:
short a=11;
float f=a; //short类型的变量a自动转换为float类型
(2)强制类型转换
强制类型转换是指在程序中显式地进行类型转换。
取值范围大的类型转化为取值范围小的类型,必须进行强制类型转化。
例如:
int a=129;
//把int类型变量a强制转换为byte类型,变量b的值为-127
byte b=(byte)a;
//把int类型直接数129强制转换为byte类型,变量c的值为-12
byte c=(byte)129;
注意:强制类型转换有可能会导致数据溢出或精度的下降,应该尽量避免使用强制类型转换。例如以下代码把int类型强制转换为byte类型,会导致数据溢出:
int a=256;
byte b=(byte)a; //数据溢出,变量b的值为0
short和char之间的赋值总需要一个强制类型转化
eg:
byte b=1;
int i=b;
short s=(short)i;
char c=(char)s;
1.以下哪个赋值语句是合法的?
A) String s=2+3+’a’;
B) String s=1+”H”;
C) short c=12+3;
D) float f=11.3+4;
答案:B
2.运行以下程序,得到什么打印结果?
System.out.println( 1 >>> 1);
System.out.println( -1 >> 31);
System.out.println( 2 >> 1);
System.out.println( 1 << 1);
答案:0 -1 1 2
3.以下temp变量的最终取值是什么?
long temp = (int)3.9;
temp %= 2;
答案:1
4.以下代码能否编译通过,假如能编译通过,运行时得到什么打印结果?
int output=10;
boolean b1 = false;
if((b1!=true) || ((output+=10)==20)){
System.out.println("We are equal "+output);
}else{
System.out.println("Not equal! "+output);
}
答案:打印“We are equal 10”
5.以下代码能否编译通过,假如能编译通过,运行时得到什么打印结果?
int output=10;
boolean b1 = false;
if((b1!=true) | ((output+=10)==20)){
System.out.println("We are equal "+output);
}else{
System.out.println("Not equal! "+output);
}
答案:打印“We are equal 20”



