- 运算符: 是一种特殊的符号,用以表示数据的运算、赋值和比较等。
- 表达式: 用运算符连接起来的式子
在Java中,一共有38个运算符。
1. 运算符的分类
-
按照功能划分:
分类 运算符 算术运算符 +
、-
、*
、/
、%
、++
、--
赋值运算符 =
、+=
、-=
、*=
、/=
、%=
等关系运算符 >
、>=
、<
、<=
、==
、!=
逻辑运算符 &
、`条件运算符 (条件表达式)?结果1:结果2;
位运算符(了解) &
、` -
按照操作数个数划分:
分类 运算符 例子 一元(单目)运算符 ++、–、! i++、–i 二元(双目)运算符 +、-、*、/、%、>、<=等 a+b、10>=9 三元(三目)运算符 表达式1?表达式2:表达式3 age>=18?“成年”:“未成年”
2. 算术运算符
算术运算符 | 符号解释 |
---|---|
+ |
加法运算,字符串连接运算,正号 |
- |
减法运算,负号 |
* |
乘法运算 |
/ |
除法运算,整数/整数结果还是整数 |
% |
求余运算,余数的符号只看被除数 |
++ 、 --
|
自增自减运算 |
-
加、减、乘、除、模
public class OperatorDemo01 { public static void main(String[] args) { int a = 3; int b = 4; System.out.println(a + b);// 7 System.out.println(a - b);// -1 System.out.println(a * b);// 12 System.out.println(a / b);// 计算机结果是0,为什么不是0.75呢? System.out.println(a % b);// 3 System.out.println(5%2);//1 System.out.println(5%-2);//1 System.out.println(-5%2);//-1 System.out.println(-5%-2);//-1 //商*除数 + 余数 = 被除数 //5%-2 ==>商是-2,余数时1 (-2)*(-2)+1 = 5 //-5%2 ==>商是-2,余数是-1 (-2)*2+(-1) = -4-1=-5 } }
-
“+”号的两种用法
-
第一种:对于
+
两边都是数值的话,+
就是加法的意思 -
第二种:对于
+
两边至少有一边是字符串得话,+
就是拼接的意思public class OperatorDemo02 { public static void main(String[] args) { // 字符串类型的变量基本使用 // 数据类型 变量名称 = 数据值; String str1 = "Hello"; System.out.println(str1); // Hello System.out.println("Hello" + "World"); // HelloWorld String str2 = "Java"; // String + int --> String System.out.println(str2 + 520); // Java520 // String + int + int // String + int // String System.out.println(str2 + 5 + 20); // Java520 } }
-
-
自加自减运算
理解:
++
运算,变量自己的值加1。反之,--
运算,变量自己的值减少1,用法与++
一致。-
单独使用
-
变量在单独运算的时候,变量
前++
和变量后++
,变量的是一样的; -
变量
前++
:例如++a
。 -
变量
后++
:例如a++
。public class OperatorDemo3 { public static void main(String[] args) { // 定义一个int类型的变量a int a = 3; //++a; a++; // 无论是变量前++还是变量后++,结果都是4 System.out.println(a); } }
-
-
复合使用
-
和
其他变量放在一起使用
或者和输出语句放在一起使用
,前++
和后++
就产生了不同。 -
变量
前++
:变量先自身加1,然后再取值。 -
变量
后++
:变量先取值,然后再自身加1。public class OperatorDemo03 { public static void main(String[] args) { // 其他变量放在一起使用 int x = 3; //int y = ++x; // y的值是4,x的值是4, int y = x++; // y的值是3,x的值是4 System.out.println(x); System.out.println(y); System.out.println("=========="); // 和输出语句一起 int z = 5; //System.out.println(++z);// 输出结果是6,z的值也是6 System.out.println(z++);// 输出结果是5,z的值是6 System.out.println(z); int a = 1; a = a++;//(1)先取a的值“1”放操作数栈(2)a再自增,a=2(3)再把操作数栈中的"1"赋值给a,a=1 int i = 1; int j = i++ + ++i * i++; /* 从左往右加载 (1)先算i++ ①取i的值“1”放操作数栈 ②i再自增 i=2 (2)再算++i ①i先自增 i=3 ②再取i的值“3”放操作数栈 (3)再算i++ ①取i的值“3”放操作数栈 ②i再自增 i=4 (4)先算乘法 用操作数栈中3 * 3 = 9,并把9压会操作数栈 (5)再算求和 用操作数栈中的 1 + 9 = 10 (6)最后算赋值 j = 10 */ } }
-
-
小结:
- ++在前,先自加,后使用;
- ++在后,先使用,后自加。
-
-
练习
-
(1)获取一个四位数的个位,十位,百位,千位
public class Test01 { public static void main (String [] args) { //1.定义一个四位数,例如1234 int num = 1234; //2.通过运算操作求出个位,十位,百位,千位 int ge = ? int shi = ? int bai = ? int qian = ? System.out.println(num + "这个四位数个位上的数字是:" + ge); System.out.println(num + "这个四位数十位上的数字是:" + shi); System.out.println(num + "这个四位数百位上的数字是:" + bai); System.out.println(num + "这个四位数千位上的数字是:" + qian); } }
-
(2)自增自减练习
判断如下代码的运行结果
public static void main(String[] args){ int i = 1; int j = i++; int k = i++ * ++j + ++i * j++; System.out.println("i = " + i); System.out.println("j = " + j); System.out.println("k = " + k); }
public static void main(String[] args){ int i = 1; int j = i++; int k = i++ * ++j + --i * j--; System.out.println("i = " + i); System.out.println("j = " + j); System.out.println("k = " + k); }
public static void main(String[] args){ int i = 1; int j = ++i + i++ * ++i + i++; System.out.println("i = " + i); System.out.println("j = " + j); }
public static void main(String[] args){ int i = 0; int result = ++i/--i; System.out.println("result="+result); }
-
3. 赋值运算符
注意:所有的赋值运算符的=左边一定是一个变量
赋值运算符 | 符号解释 |
---|---|
= |
将符号右边的值,赋值给左边的变量 |
+= |
将符号**左边的值 和右边的值 进行相加操作,最后将结果赋值给左边的变量 ** |
-= |
将符号**左边的值 和右边的值 进行相减操作,最后将结果赋值给左边的变量 ** |
*= |
将符号**左边的值 和右边的值 进行相乘操作,最后将结果赋值给左边的变量 ** |
/= |
将符号**左边的值 和右边的值 进行相除操作,最后将结果赋值给左边的变量 ** |
%= |
将符号**左边的值 和右边的值 进行取余操作,最后将结果赋值给左边的变量 ** |
-
基本赋值运算符课堂案例
public class OperatorDemo04 { public static void main(String[] args) { int a = 3; int b = 4; a = a + b; System.out.println(a); // 7 System.out.println(b); // 4 } }
-
扩展赋值运算符课堂案例
public class OperatorDemo04 { public static void main(String[] args) { int a = 3; int b = 4; b += a;// 相当于 b = b + a ; System.out.println(a); // 3 System.out.println(b); // 7 short s = 3; // s = s + 4; 代码编译报错,因为将int类型的结果赋值给short类型的变量s时,可能损失精度 s += 4; // 代码没有报错 //因为在得到int类型的结果后,JVM自动完成一步强制类型转换,将int类型强转成short System.out.println(s); int j = 1; j += ++j * j++;//相当于 j = j + (++j * j++); System.out.println(j);//5 } }
扩展赋值运算符在将最后的结果赋值给左边的变量前,都做了一步强制类型转换。
-
练习
交换两个变量的值
int m = 1;
int n = 2;int temp=m; m=n; n=temp;
4. 关系运算符/比较运算符
比较运算符,是两个数据之间进行比较的运算,运算结果一定是boolean值true
或者false
。
关系运算符 | 符号解释 |
---|---|
< |
比较符号左边的数据是否小于右边的数据,如果小于结果是true。 |
> |
比较符号左边的数据是否大于右边的数据,如果大于结果是true。 |
<= |
比较符号左边的数据是否小于或者等于右边的数据,如果大于结果是false。 |
>= |
比较符号左边的数据是否大于或者等于右边的数据,如果小于结果是false。 |
== |
比较符号两边数据是否相等,相等结果是true。 |
!= |
不等于符号 ,如果符号两边的数据不相等,结果是true。 |
-
课堂案例
public class OperatorDemo05 { public static void main(String[] args) { int a = 3; int b = 4; System.out.println(a < b); // true System.out.println(a > b); // false System.out.println(a <= b); // true System.out.println(a >= b); // false System.out.println(a == b); // false System.out.println(a != b); // true } }
-
练习:判断如下程序的运行结果
public static void main(String[] args){ int a = 1; int b = 2; int c = 0; boolean flag = false; if(flag=true){ c = a++ + b; } if(flag=false){ c = ++a - b; } System.out.println("a = " + a); System.out.println("b = " + b); System.out.println("c = " + c); }
5. 逻辑运算符
逻辑运算符,是用来连接两个布尔类型结果的运算符(!
除外),运算结果一定是boolean值true
或者false
逻辑运算符 | 符号解释 | 符号特点 |
---|---|---|
& |
与,且 | 有false 则false
|
` | ` | 或 |
^ |
异或 | 相同为false ,不同为true
|
! |
非 | 非false 则true ,非true 则false
|
&& |
双与,短路与 | 左边为false,则右边就不看 |
` | ` |
-
课堂案例
public class OperatorDemo06 { public static void main(String[] args) { int a = 3; int b = 4; int c = 5; // & 与,且;有false则false System.out.println((a > b) & (a > c)); System.out.println((a > b) & (a < c)); System.out.println((a < b) & (a > c)); System.out.println((a < b) & (a < c)); System.out.println("==============="); // | 或;有true则true System.out.println((a > b) | (a > c)); System.out.println((a > b) | (a < c)); System.out.println((a < b) | (a > c)); System.out.println((a < b) | (a < c)); System.out.println("==============="); // ^ 异或;相同为false,不同为true System.out.println((a > b) ^ (a > c)); System.out.println((a > b) ^ (a < c)); System.out.println((a < b) ^ (a > c)); System.out.println((a < b) ^ (a < c)); System.out.println("==============="); // ! 非;非false则true,非true则false System.out.println(!false); System.out.println(!true); } }
-
&&和&区别,||和|区别
短路与,短路或运算符左边表达式结果可以确定最终结果,则运算符右边表达式不再进行运算,效率高
-
&&
和&
区别:&&
和&
结果一样,&&
有短路效果,左边为false,右边不执行;&
左边无论是什么,右边都会执行。 -
||
和|
区别:||
和|
结果一样,||
有短路效果,左边为true,右边不执行;|
左边无论是什么,右边都会执行。
public class LogicExer1{ public static void main(String[] args){ int x = 1; int y = 1; //x==2 ,x++ false x = 2 左边为false //右边继续 //++y y==2 y=2 y==2成立 右边为true //false & true 结果false if(x++==2 & ++y==2){ x =7; } System.out.println("x="+x+",y="+y);//x=2,y=2 } }
public class LogicExer2{ public static void main(String[] args){ int x = 1,y = 1; //x==2,x++ 左边条件为false,x=2 //因为短路与,右边不算 //false && ? 结果是false if(x++==2 && ++y==2){ x =7; } System.out.println("x="+x+",y="+y);//x=2,y=1 } }
public class LogicExer3{ public static void main(String[] args){ int x = 1,y = 1; //x==1,x++ 左边为true,x=2 //因为是逻辑与,右边继续 //++y, y==1 y=2 右边为false //条件true | false,最终为true if(x++==1 | ++y==1){ x =7; } System.out.println("x="+x+",y="+y);//x=7,y=2 } }
public class LogicExer4{ public static void main(String[] args){ int x = 1,y = 1; //x==1,x++ 左边为true,x=2 //因为是短路或,左边为true,右边就不看了 //整个条件为true if(x++==1 || ++y==1){ x =7; } System.out.println("x="+x+",y="+y);//x=7,y=1 } }
public class LogicExer5{ public static void main (String [] args) { boolean x = true; boolean y = false; short z = 42; //如果if((z++==42)&&(y==true))条件成立,执行z++,不成立,就不执行z++ //左边的条件:z==42,z++ z==42成立,z++变成43 //中间虽然是短路与,因为左边现在是true,右边还要看 //右边 y==true 不成立 //true && false 结果为false if((z++==42)&&(y==true)) z++; //左边为x=false,赋值 结果就为false //中间虽然为短路或,因为左边是false,右边继续看 //++z,z==45 ++z变成44,z==45是否成立,不成立 //false || false 结果为false if((x=false) || (++z==45)) z++; System. out.println("z="+z);//44 } }
class Test4_2 { public static void main (String [] args) { boolean x = true; boolean y = false; short z = 42; //如果if(y=true)条件成立,接着判断if((z++==42)&&(y==true)) z++; //如果不成立,if((z++==42)&&(y==true)) z++; 不看的 /* if(y = true) if((z++==42)&&(y==true)) z++; if((x=false) || (++z==45)) z++; */ //标准 //y=true赋值,y就被修改为true,if(true)成立 if(y=true){ //左边:z==42,z++ 成立,z变成43 //&&短路与,不满足短路的情况,右边继续 //y==true 成立 //true && true,结果为true if((z++==42)&&(y==true)){ //z++变成44 z++; } } //左边:x=false不成立 //中间虽然是短路或,但是没满足短路的情况,右边继续 //++z,z==45 ++z变成45,z==45成立 if((x=false) || (++z==45)){ //z++,变成46 z++; } System. out.println("z="+z);//46 } }
-
6. 条件运算符
- 条件运算符格式:
条件表达式?结果1:结果2
- 条件运算符计算方式:
- 条件判断的结果是true,条件运算符整体结果为结果1,赋值给变量。
- 判断条件的结果是false,条件运算符整体结果为结果2,赋值给变量。
public static void main(String[] args) {
int i = (1==2 ? 100 : 200);
System.out.println(i);//200
int j = (3<=4 ? 500 : 600);
System.out.println(j);//500
}
练习
1、声明三个整型的变量,a,b,c,要求找出最大值
2、声明一个整型的变量,判断它是正数还是负数,还是0
7. 位运算符(了解)
位运算符 | 符号解释 |
---|---|
& |
按位与,当两位相同时为1时才返回1 |
` | ` |
~ |
按位非,将操作数的每个位(包括符号位)全部取反 |
^ |
按位异或。当两位相同时返回0,不同时返回1 |
<< |
左移运算符 |
>> |
右移运算符 |
>>> |
无符号右移运算符 |
- 位运算符的运算过程都是基于补码运算,但是看结果,我们得换成原码,再换成十进制看结果
- 从二进制到十进制都是基于原码
- byte,short,char在计算时按照int类型处理
- 位运算直接对二进制进行位移操作实现数值运算,所以运算效率高
如何区分&,|,^是逻辑运算符还是位运算符?
如果操作数是boolean类型,就是逻辑运算符,如果操作数是整数,那么就位运算符。
-
左移:<<
运算规则:左移几位就相当于乘以2的几次方
**注意:**当左移的位数n超过该数据类型的总位数时,相当于左移(n-总位数)位
byte,short,char在计算时按照int类型处理
3<<4 类似于 3*2的4次= 3*16 = 48
-3<<4 类似于 -3*2的4次= -3*16 = -48
-
右移:>>
快速运算:类似于除以2的n次幂,如果不能整除,向下取整
69>>4 类似于 69/2的4次 = 69/16 =4
-69>>4 类似于 -69/2的4次 = -69/16 = -5
-
无符号右移:>>>
运算规则:往右移动后,左边空出来的位直接补0,不看符号位
正数:和右移一样
负数:右边移出去几位,左边补几个0,结果变为正数
69>>>4 类似于 69/2的4次 = 69/16 =4
-69>>>4 结果:268435451
-
按位与:&
运算规则:对应位都是1才为1
1 & 1 结果为1
1 & 0 结果为0
0 & 1 结果为0
0 & 0 结果为0
9&7 = 1
-9&7 = 7
-
按位或:|
运算规则:对应位只要有1即为1
1 | 1 结果为1
1 | 0 结果为1
0 | 1 结果为1
0 & 0 结果为0
9|7 结果: 15
-9|7 结果: -9
-
按位异或:^
运算规则:对应位一个为1一个为0,才为1
1 ^ 1 结果为0
0 ^ 1 结果为1
0 ^ 0 结果为0
9^7 结果为14
-9^7 结果为-16
-
按位取反
运算规则:
~0就是1
~1就是0
~9 结果:-10
~-9 结果:8
8. 运算符优先级
提示说明:
(1)表达式不要太复杂
(2)先算的使用()
- 大体的排序:算术 > 位 > 比较 > 逻辑 > 三元 > 赋值
9. 标点符号
在Java中一共有12个标点符号。(后面再一一学习)
- 小括号()用于强制类型转换、表示优先运算表达式、方法参数列表
- 大括号{}用于数组元素列表、类体、方法体、复合语句代码块边界符
- 中括号[]用于数组
- 分号;用于结束语句
- 逗号,用于多个赋值表达式的分隔符和方法参数列表分隔符
- 英文句号.用于成员访问和包目录结构分隔符
- 英文省略号…用于可变参数
- @用于注解
- 双冒号::用于方法引用
各个标点符号的使用在后续章节中一一揭晓。文章来源:https://www.toymoban.com/news/detail-718140.html
文章来源地址https://www.toymoban.com/news/detail-718140.html
到了这里,关于从0开始学Java:运算符(Operator)与标点符号(Separators)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!