Day09——运算符
基本运算符
运算符
Java 语言支持如下运算符: (重点掌握前4个)
算术运算符:+、-、*、/、%、++; --
赋值运算符: =
关系运算符:>、<、>=、<=、==、!=、instanceof(稍后再讲)
逻辑运算符:&&、||、!
位运算符:&、|、^、~、>>、<<、>>>;(了解)
条件运算符: ? :
扩展赋值运算符:+=、-=、*=、/=。
详细解释:
/ 除法
% 取余 左操作数除以右操作数的余数
= 赋值运算符,将右操作数的值赋给左侧操作数,C = A + B将把A + B得到的值赋给C
== 判断如果两个操作数的值是否相等,如果相等则条件为真。对于String类型,==运算符用于比较两个对象的引用是否相同。
!= 判断如果两个操作数的值是否不相等,如果值不相等则条件为真。
按位与(&) :对两个整数的二进制表示的每一位进行与运算。只有当两个相应位都为 1 时,结果位才为 1,否则为 0。 例如:5(二进制为 0101)& 3(二进制为 0011),结果为 0001,即 1。
按位或(|):对两个整数的二进制表示的每一位进行或运算。只要两个相应位中有一个为 1,结果位就为 1。 例如:5(二进制为 0101)| 3(二进制为 0011),结果为 0111,即 7。
按位异或(^):对两个整数的二进制表示的每一位进行异或运算。当两个相应位不同时,结果位为 1,相同时为 0。 例如:5(二进制为 0101)^ 3(二进制为 0011),结果为 0110,即 6。
按位取反(~):对一个整数的二进制表示的每一位进行取反操作。0 变为 1,1 变为 0。 例如:~5(二进制为 0101),结果为 1010,由于计算机中以补码形式存储,所以结果为 -6。
左移(<<):将一个整数的二进制表示向左移动指定的位数。左移一位相当于乘以 2。 例如:5(二进制为 0101)<< 1,结果为 1010,即 10。
右移(>>) :将一个整数的二进制表示向右移动指定的位数。正数右移一位相当于除以 2,负数右移时,高位补符号位。 例如:5(二进制为 0101)>> 1,结果为 0010,即 2。
无符号右移(>>>): 无论操作数是正数还是负数,无符号右移都用 0 填充高位。 例如:-5(二进制为 11111111111111111111111111111011)>>> 1,结果为 01111111111111111111111111111101,即 2147483645。
逻辑运算符:判断与 或 非的关系 and or
//二元运算符 两个数的运算
//Ctrl+D 复制当前行到下一行
//Ctrl+Y 删除当前行
//Shift + Enter:在当前行的下方开始新行
int a=10;
int b=20;
int c=25;
int d=25;
System.out.println(a+b);
System.out.println(a-b);
System.out.println(a*b);
System.out.println((double)a/b); //在计算时,要小心结果小数部分四舍五入的问题。可以把一个数转换类型
关系运算符
//关系运算符返回的结果:正确、错误 布尔值
int i1=10;
int i2=12;
System.out.println(i1==i2);//false
System.out.println(i1!=i2);//true
System.out.println(i1<i2);//true
System.out.println(i1>i2);//false
System.out.println(i1<=i2);//true
System.out.println(i1>=i2);//false
System.out.println(i2%i1); //2
自增自减运算符
//++ -- 自增 自减 一元运算符 难点!!!!!!!!!!!!!!
int a=3;
int b=a++; //a++ a先赋值给b,然后a自增 a=a+1
//a=4;b=3
int c=++a; //++a a先自增,再给b赋值
System.out.println(c);//c=5
System.out.println(a);//a=5
/*
System.out.println(a);//5
System.out.println(a);
System.out.println(b);//3
System.out.println(b);
System.out.println(c);//5
System.out.println(c);
*/
//一定要上手算一遍,才知道a++和++a的区别!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
要点:
a++ a先赋值给b,然后a自增
++a a先自增,再给b赋值
幂的计算
//拓展——幂的计算
System.out.println(Math.pow(2,3));//8.0
//Math.pow()方法返回数据是double类型
总结:
Math.pow()方法返回数据默认是double类型
逻辑运算符
//逻辑运算符
//与(and) 或(or) 非(取反)
boolean a=true;
boolean b=false;
System.out.println("a&&b:"+(a&&b)); //false 逻辑与运算:两个结果都为真,结果才为真
System.out.println("a||b:"+(a||b)); //true 逻辑或运算:有一个结果为真,结果为真
System.out.println("!a&&b:"+!(a&&b));//true 逻辑非运算:如果是真,则为假
System.out.println("==============================");
//短路运算:
// 当a&&b,a为false时,程序会不会检查b的情况?
int c=5;
boolean d=(c>6)&&(c++<1);
System.out.println(d);//false
System.out.println(c);//5 (c++<1)没有被程序所运算
//总结:当a&&b,a为false时,程序不会检查b的情况而直接输出false
总结:
&& 与运算:两个结果都为真,结果才为真
|| 或运算:有一个结果为真,结果为真
! 非运算:如果是真,则为假
位运算符
//位运算符 位运算效率高
/*
A=0011 1100
B=0000 1101
-------------------------------------------------------------
A&B 0000 1100 & 与 两个相应位都为 1 时,结果位才为 1
A|B 0011 1101 | 或 两位有1个1,就为1
A^B 0011 0001 ^ 异或 两位不同为1,相同为0
~b 1111 0010 ~ 相反 1变0;0变1
<< 左移 相当于乘二
>> 右移 /2
-------------------------------------------------------------
*/
//利用位运算符快速计算2*8 2*2*2*2
System.out.println(2<<3);
/*
0000 0000 0
0000 0001 1
0000 0010 2
0000 0011 3
0000 0100 4
0000 1000 8
0001 0000 16 每乘一个2,二进制的1就左移1位
*/
注意:
& 与 对应的两个二进位均为1时,结果位才为1 ,否则为0。
| 或 两位有1个1,就为1
- ^ 异或 两位不同为1,相同为0
- 相反 1变0;0变1
<< 左移 相当于乘二
扩展赋值运算符
//扩展赋值运算符 可偷懒
/*int a=10;
int b=20;
//a+=b; //a=a+b
a-=b; //a=a-b
System.out.println(a); //-10
System.out.println(b); //20
System.out.println(a+b); //10
*/
总结:
a+=b 相当于 a=a+b
a-=b 相当于 a=a-b
字符串连接符
//字符串连接符 +
int i1=10;
int i2=20;
System.out.println(i1+i2);//30
System.out.println(""+i1+i2);//1020 字符串在前面,后面的会进行拼接;
System.out.println(i1+i2+"");//30 字符串在后面,前面的会进行运算
//注意:""+i1+i2 和 i1+i2+"" 含义不一样
注意:
""+i1+i2 和 i1+i2+"" 含义不一样
三元运算符
//三元运算符 ? :
//x ? y : z
//如果x==true,结果为y;否则结果为z
int score=55;
String result=score<60 ? "成绩不及格":"成绩及格";
System.out.println(result);//成绩不及格
总结:
x ? y : z
如果x==true,结果为y;否则结果为z
易错题:
- 以下代码的输出结果是? 正确答案:B
String str1 = "Hello";
String str2 = new String("Hello");
System.out.println(str1 == str2);
A. true
B. false
C. 编译错误
D. 运行时错误
解析:在 Java 中,==运算符用于比较两个对象的引用是否相同。对于String类型,str1 = "Hello";这里str1指向的是字符串常量池中的"Hello"对象,而str2 = new String("Hello");这种方式会在堆内存中重新创建一个新的"Hello"对象,虽然内容相同,但它们的引用是不同的。所以str1 == str2的结果是false,因为它们指向的不是同一个对象实例。

浙公网安备 33010602011771号