Java 运算符和表达式

简介: Java 运算符和表达式

Java 运算符和表达式

运算符就是对字面量(常量)或变量进行操作的符号,例:+(加号)、-(减号)、*(乘号)、/(除号)等;

==运算符又分为算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符、三元运算符等;==

表达式就是用运算符把字面量(常量)或变量连接起来的符合 Java 语法的式子,例:int c = a + b ,其中 a + b 就是一个表达式;

使用不同的运算符连接起来的表达式体现的是不同类型的表达式。例:

public class demo{
   
    public static void main(String[] args)
    {
   
        int a = 10;  //定义一个整型变量 a ,赋值为10
        int b = 15;  //定义一个整型变量 b ,赋值为15
        int c = a + b; //定义一个整型变量 c ,赋值为 a + b
        //在 int c = a + b 中 + (加号)是算术运算符,所以 a + b 就是算术表达式
        System.out.println(c);  //输出变量 c 的值
    }
}

一、算术运算符及表达式

算术运算符:

符号 作用 说明
+ 加法
- 减法
* 乘法
/ 除法
% 取模 取模(取余)就是取余数
++ 自增 (两个加号)自身加1
- - 自减 (两个减号)自身减1

加、减、乘、除四则运算我们从小学就开始接触,用法我们都已经很熟悉了,就不过多的阐述了。

% 取模(取余)就是取余数,例:int x = 7 % 3 ( x = 1) ,类似于 7 / 3 = 2 ······1(余数),取模就是只取余数

++、- - 是一元运算符,参与运算的是单变量,其功能是自身加 1 或自身减 1。而它们又可以分为前置运算和后置运算(就是符号放在前面和符号放在后面),如 ++i,i++,- -i,i- -;

自增自减运算符,前置时要先自加或自减再代入表达式,后置时要先代入表达式再进行自加或自减。

例 1:当自增自减运算符前置时

public class Demo1{
   
    public static void main(String[] args){
   
        //当自增自减运算符前置时,先自增自减,再参与运算
        int a = 4;
        int i = 3;
        int j = 3;
        int x = ++i * a;  // 4 * 4  (++i 时,i 先自加 1( 2 + 1 = 3 ),再代入表达式运算)
        int y = --j * a;  // 2 * 4  (--i 时,i 先自减 1( 2 - 1 = 1 ),再代入表达式运算)
        System.out.println("x = " + x + ",y = "+ y);  //输出结果为 x = 16,y = 8
    }
}

例 2:当自增自减运算符后置时

public class Demo2{
   
    public static void main(String[] args){
   
        //当自增自减运算符后置时,先参与运算,再自增自减
        int a = 4;
        int i = 3;
        int j = 3;
        int x = a * i++;  // 4 * 3  ( i++ 时,i 先代入表达式运算,再自加 1( 2 + 1 = 3 ))
        int y = a * j--;  // 4 * 3  ( i-- 时,i 先代入表达式运算,再自减 1( 2 + 1 = 3 ))
        System.out.println("x = "+ x + ",y = " + y);  //输出结果为 x = 12,y = 12
    }
}

二、关系运算符及表达式

注:程序中的等于符号使用两个等号表示(==),而一个符号(=)在程序是赋值符号

关系运算符用于两个值的比较运算

关系运算符:

符号 说明
> 大于
< 小于
>= 大于等于
<= 小于等于
== 等于
!= 不等于

关系运算符组成关系表达式产生一个布尔值,若关系表达式成立,则生成一个 true 值;不成立则生成一个 false 值。

例:当 x = 10,y = 20 则表达式
x < y 的值为 true ;x > y 的值为 false


三、逻辑运算符及表达式

1、&&( 逻辑与 )

&& 用于两个布尔逻辑或关系表达式的与运算;
&& (与)运算的一般形式是:A && B
当 A 、B 是布尔逻辑或关系表达式时,若 A 和 B 都为 true ,则 A && B 的值为 true,否则只要其中一个为 false ,则 A && B 的值为 false
==与运算时,同真为真,有假则假==

例:当 x = 10,y = 20,z = 30 ,则表达式
( x < y )&& ( y < z ) 的值为 true(因为表达式 x < y 成立,值为真;y < z 成立,值为真;同时为真则为真)
( x > y )&& ( y < z ) 的值为 true(因为表达式 x > y 不成立,值为假;y < z 成立,值为真,有假则假)

2、|| (逻辑或)

|| 用于布尔逻辑或关系表达式的或运算
|| (或)运算的一般形式是:A || B
当 A 、B 是布尔逻辑或关系表达式时,若 A 和 B 中只要其中有一个值为 true ,则 A || B 的值为 true;而要 A || B 的值为 false ,则必须同时都为 false 才行
==或运算时,有真则真,同假为假==

例:当 x = 10,y = 20,z = 30 ,则表达式
( x < y )|| ( y < z ) 的值为 true(因为表达式 x < y 成立,值为真;y < z 成立,值为真;只要有一个为真则为真)
( x > y )|| ( y < z ) 的值为 true(因为表达式 x > y 不成立,值为假;y < z 成立,值为真;只要有一个为真则为真)
( x > y )|| ( y > z ) 的值为 false(因为表达式 x > y 不成立,值为假;y > z 不成立,值为假;都为假才为假)

3、!(逻辑非)

!用于单个逻辑或关系表达式的运算,作用是操作数取反
!(非)运算的一般形式是: !A
其中 A 是布尔关系或逻辑表达式,若 A 的值为 true,则 !A 的值为 false;若 A 的值为 false ,则 !A 的值为 true
==非运算,真变假,假变真==

例:若 x = 20,y = 30,则表达式
!( x > y ) 的值为 true(因为 x > y 不成立,值为假;而经过非运算后值为真)
!( x < y ) 的值为 false(因为 x < y 成立,值为真;而经过非运算后值为假)


四、位运算符及表达式

1、移位运算

(1)位右移运算( >> )

位右移符号 >> 用于整数的二进制位右移运算,在移位操作的过程中,符号位不变,其他位右移
例:将整数 A 进行右移 2 位的操作:A >> 2

(2)位右移运算( << )

位左移符号 << 用于整数的二进制位左移运算,在移位操作的过程中,左边的位移除(舍弃),右边的位补 0
例:将整数 A 进行左移 2 位的操作:A << 2

(3)不带符号右移运算( >>> )

不带符号右移符号 >>> 用于整数二进制位右移运算,在移位操作过程中,右边移除(舍弃),左边的位补 0
例:将整数 A 进行不带符号右移 2 位运算:A >>> 2

2、按位运算

(1)& (按位与)

& 运算符用于两个整数的二进制按位与运算;在按位与操作过程中,如果对应的位都为 1 ,则该位的运算结果为 1,否则为 0
例:A = 10,B = 11,将整数 A 和 B 进行按位与操作 A & B,则 A & B 的结果为 10

A = 10,10 转换成二进制是 1010
B = 11,11 转换成二进制是 1011
1010~(2)~ (A)
1011~(2)~ (B)
1010~(2)~ (A & B)转换为十进制就是 10 ,按位与就是把它们的二进制对应的位进行与运算

(2)| (按位或)

| 运算符用于两个整数的二进制按位或运算;在按位或操作过程中,对应的位中只要有一个为 1 ,则该位的运算结果为 1;对应的位要同时为 0 该位的运算结果才为 0
例:A = 10,B = 11,将整数 A 和 B 进行按位或操作 A | B,则 A | B 的结果为 11

A = 10,10 转换成二进制是 1010
B = 11,11 转换成二进制是 1011
1010~(2)~ (A)
1011~(2)~ (B)
1011~(2)~(A | B)转换成十进制就是 11,按位或就是把它们的二进制对应的位进行或运算

(3)^ (按位异或)

^ 运算符用于两个整数的二进制按位异或运算,在按位异或操作过程中,如果对应位的值相异(一个为 0,一个为 1),则该位的运算结果位 1,否则,为 0
例:A = 10,B = 11,将整数 A 和 B 进行按位异或操作 A ^ B,则 A ^ B 的结果为 1

A = 10,10 转换成二进制是 1010
B = 11,11 转换成二进制是 1011
1010~(2)~ (A)
1011~(2)~ (B)
0001~(2)~ (A ^ B) 转换成十进制就是 1 ,按位异或就是把它们的二进制对应的位进行异或运算,不同为 1

(4)~ (按位取反)

~ 运算符,用于单个整数的二进制位按位取反操作(及将二进制位的 0 变 1,1 变 0 )
例:A = 10,将 A 进行按位取反操作:~A,而 ~A 的值为 3

A = 10,10 转换成二进制是 1010
1010~(2)~(A)
0101~(2)~ (~A) 转换为十进制就是 3,按位取反就是把它们的二进制对应的位取反,0 变 1,1 变 0


五、赋值运算符及表达式

注:在表格里面 |= 符号打不出来,所以我用 或= 表示

赋值运算符:

符号 说明
= 最常用的赋值符号
+= A += B 类似于 A = A + B (运算时自身也要参与运算,将 A + B 的值赋予 A)
-= A -= B 类似于 A = A - B (将 A - B 的值赋予 A)
*= A = B 类似于 A = A B (将 A * B 的值赋予 A)
/= A /= B 类似于 A = A / B (将 A / B 的值赋予 A)
%= 下面这些运算符用法都类似上面的
&= ……
^= ……
或= ……
<<= ……
>>= ……
>>>= ……

六、三元运算符及表达式

三元运算符( ? : )也称条件运算符,由三元运算符组成的的条件表达式格式如下:

逻辑(关系)表达式 ? 表达式 1 :表达式 2

如果逻辑(关系)表达式的值为 true,则取表达式 1 的值;如果逻辑(关系)表达式的值为 false,则取表达式 2 的值
例:定义整型变量 a 和 b,并将它们赋值 a = 10,b = 20,求 a、b 中的最大值,并将最大值赋予变量 max。

public class Demo{
   
    public static void main(String[] args){
   
        int a = 10;
        int b = 20;
        int max = a > b ? a : b  //表达式 a > b 成立,则取 a(表达式 1)的值,不成立则取 b(表达式 2)的值
        System.out.println("最大值为" + max); //输出最大值为20,由于表达式不成立,所以最大值取表达式 2 的值,就是 b 的值
    }
}

七、表达式的运算规则

1、Java 运算符的运算规则

注:在表格里面符号 | ,符号 || 打不出来,所以用 或 表示符号(|) 用 或或 表示符号(||)

Java 运算符的优先级:

…… …… ……
1 . 、[] 、()
2 new,(数据类型)
3 * 、/、 % 算术运算符
4 +、- ……
5 >>、>>>、<< 位运算符
6 >、<、>=、<=、instanceof 关系运算符
7 ==、!= ……
8 & 位运算符
9 ^ ……
10 ……
11 && 逻辑运算符
12 或或 ……
13 ?: 三元运算符
14 =、+=、-=、*=、/=、%=、^= 拓展赋值运算符
15 &=、或=、<<=、>>=、>>>= ……

2、类型转换

整型、实型、字符型数据可以混合运算。一般情况下,系统会默认将两个不同级别的中低级的运算数,转换为一致的更高级别的数据类型的运算数,然后再进行运算。

数据类型从高级到低级顺序如下:
==double > float > long > int > short > byte==
==int > char== 字符类型在和其他数据类型运算时会先根据 ASCII 码转换成 int 类型,然后参与运算。

要将高类型的数据类型转换成低类型的数据类型时,需要进行强制转化,而在转换过程中会造成数据溢出或者数据精度下降。


如果文章对各位小伙伴有帮助的话欢迎三连!!!

另外,文章如有错误之处,也欢迎各位大佬批评指正!!!

相关文章
|
2月前
|
Java Go 开发工具
【Java】(4)五种运算符的说明(&&、||、>=、>、<=、<)、4种控制语句(if、for、while、dowhile)、输入和输出说明
扩展类的赋值运算符不改变运算结果类型,假设最初这个变量的的类型byte类型,无论怎么进行加或追减,最终该变量的数据类型还是byte类型。注:一个表达式中有多个运算符,运算符有优先级,不确定的加小括号,优先级得到提升。当布尔表达式的结果是false的时候,选择表达式2作为整个表达式的执行结果。当布尔表达式的结果是true的时候,选择表达式1作为整个表达式的执行结果。当用户输入的时候,并且最终敲回车键的时候,键入的信息会自动赋值给a。并且,连接运算之后的结果还是一个字符串类型。表达式1 : 表达式2。
152 1
|
4月前
|
Java 编译器 API
Java Lambda表达式与函数式编程入门
Lambda表达式是Java 8引入的重要特性,简化了函数式编程的实现方式。它通过简洁的语法替代传统的匿名内部类,使代码更清晰、易读。本文深入讲解Lambda表达式的基本语法、函数式接口、方法引用等核心概念,并结合集合操作、线程处理、事件回调等实战案例,帮助开发者掌握现代Java编程技巧。同时,还解析了面试中高频出现的相关问题,助你深入理解其原理与应用场景。
|
4月前
|
存储 缓存 算法
Java数据类型与运算符深度解析
本文深入解析Java中容易混淆的基础知识,包括八大基本数据类型(如int、Integer)、自动装箱与拆箱机制,以及运算符(如&与&&)的使用区别。通过代码示例剖析内存布局、取值范围及常见陷阱,帮助开发者写出更高效、健壮的代码,并附有面试高频问题解析,夯实基础。
|
4月前
|
安全 Java API
Java中的Lambda表达式:简洁与功能的结合
Java中的Lambda表达式:简洁与功能的结合
465 211
|
4月前
|
安全 Java
Java中的Switch表达式:更简洁的多路分支
Java中的Switch表达式:更简洁的多路分支
493 211
|
4月前
|
Java 编译器
Java 17 Switch表达式:更简洁、更强大的流程控制
Java 17 Switch表达式:更简洁、更强大的流程控制
|
5月前
|
设计模式 数据采集 Java
Java正则表达式的基础知识,进阶至熟练掌握。
通过大量的练习来熟悉它们的识别模式、如何设计模式来解决实际问题,才能够逐步达到熟练掌握。更多的是通过实践、编写代码和解决真实问题来完善技能。在这方面,没有快速的捷径,唯有刻意练习和长时间的代码实践。
116 0
|
5月前
|
自然语言处理 Java Apache
在Java中将String字符串转换为算术表达式并计算
具体的实现逻辑需要填写在 `Tokenizer`和 `ExpressionParser`类中,这里只提供了大概的框架。在实际实现时 `Tokenizer`应该提供分词逻辑,把输入的字符串转换成Token序列。而 `ExpressionParser`应当通过递归下降的方式依次解析
361 14
|
6月前
|
SQL JSON 安全
Java 8 + 中 Lambda 表达式与 Stream API 的应用解析
摘要:本文介绍了Java 8+核心新特性,包括Lambda表达式与Stream API的集合操作(如过滤统计)、函数式接口的自定义实现、Optional类的空值安全处理、接口默认方法与静态方法的扩展能力,以及Java 9模块化系统的组件管理。每个特性均配有典型应用场景和代码示例,如使用Stream统计字符串长度、Optional处理Map取值、模块化项目的依赖声明等,帮助开发者掌握现代Java的高效编程范式。(150字)
120 1