9. 【Java】运算符

摘要:本文系统讲解Java运算符的核心知识,涵盖算术、赋值、关系、逻辑、位运算符五大类别,详细解析自增自减的前后置区别、逻辑运算符的短路特性、运算符优先级等关键概念,并通过综合代码示例演示实际应用,帮助初学者快速掌握Java数据处理的基础工具,为后续学习if/switch等流程控制语句打下坚实基础。

关键词:Java运算符, 算术运算符, 逻辑运算符, 运算符优先级, 短路特性


前面两篇,我们聊了变量和常量——它们是数据的“容器”。但程序如果只是静静地存放数据,那跟一个数据库没什么区别。程序真正的魅力在于处理数据:把两个数字加起来、判断一个数是否大于另一个、把几个条件组合起来做决策……这些“处理动作”,靠的就是今天的主角——运算符(Operator)

运算符就像是数学里的加减乘除符号,但在编程里,它的家族要庞大得多。今天我会带你认识 Java 中最常用的几类运算符,并告诉你什么时候用、怎么用。别担心,它们都很直观,你很快就能上手。


1. 算术运算符

算术运算符就是我们从小熟悉的加减乘除,外加取余(求模)和自增自减。

运算符含义示例结果
+加法5 + 38
-减法5 - 32
*乘法5 * 315
/除法5 / 31(整数除法,向下取整)
%取余(模)5 % 32(5 除以 3 的余数)
++自增i++++i自身加 1
--自减i----i自身减 1

最需要注意的就是除法:如果两个操作数都是整数,结果也是整数,小数部分会被直接截掉(不是四舍五入)。如果想得到小数结果,至少要把其中一个操作数变成浮点数。

inta=7;intb=2;System.out.println(a/b);// 输出 3,不是 3.5System.out.println(a/2.0);// 输出 3.5,因为 2.0 是 double

取余运算%很实用,比如判断一个数是奇数还是偶数:num % 2 == 0就是偶数。

自增自减的前置与后置区别

++--既可以放在变量前面(前置),也可以放在后面(后置),它们对变量的最终效果是一样的(都加 1 或减 1),但表达式的返回值不同

  • 前置(++i):先自增,再返回值。
  • 后置(i++):先返回值,再自增。

看个例子就明白了:

inti=5;intj=++i;// i 先变成 6,再把 6 赋给 j,所以 i=6, j=6intx=5;inty=x++;// 先把 5 赋给 y,然后 x 变成 6,所以 x=6, y=5

初学时容易搞混,我的建议是:在独立的语句中使用自增自减,比如单独写一行i++;,不要把它和赋值混在一起,这样最安全。


2. 赋值运算符

最基本的赋值运算符就是等号=,它的作用是把右边的值赋给左边的变量。

intage=25;// 把 25 赋给 age

Java 还提供了一系列复合赋值运算符,把算术运算和赋值合并在一起,让代码更简洁:

运算符示例等价于
+=a += 5a = a + 5
-=a -= 5a = a - 5
*=a *= 5a = a * 5
/=a /= 5a = a / 5
%=a %= 5a = a % 5

这些运算符不仅写起来短,而且执行效率通常也略高一点点(因为只计算一次左侧的地址)。习惯使用它们能让代码更专业。

inttotal=100;total+=20;// total 变成 120total*=2;// total 变成 240System.out.println(total);// 240

3. 关系运算符

关系运算符用来比较两个值,结果是一个布尔值(truefalse)。它们在条件判断(如 if 语句)中非常关键。

运算符含义示例结果
==等于5 == 3false
!=不等于5 != 3true
>大于5 > 3true
<小于5 < 3false
>=大于等于5 >= 3true
<=小于等于5 <= 3false

⚠️ 特别注意:==是比较相等,而=是赋值。初学者经常把if (age = 18)写错——这会把 18 赋给 age,而不是比较,而且编译器会报错(因为类型不匹配)。养成习惯:比较时用==

对于引用类型(比如String),==比较的是内存地址,而不是内容。要比较字符串的内容是否相等,应该用equals()方法。我们以后会细说。


4. 逻辑运算符

逻辑运算符用来连接多个布尔表达式,得到最终的布尔结果。它们主要用在复杂的条件判断中。

运算符含义示例说明
&&逻辑与(AND)a > 5 && b < 10两边都为真,结果才为真
``逻辑或(OR)
!逻辑非(NOT)!(a > 5)将布尔值取反

短路特性(重要!)

&&||具有短路求值的特性:

  • 对于&&,如果左边已经是false,右边就不再计算了(因为整个表达式不可能为真了)。
  • 对于||,如果左边已经是true,右边就不再计算了(因为整个表达式已经为真了)。

这个特性不仅可以提高性能,还常常被用来做“安全判断”。例如:

if(name!=null&&name.length()>0){// 只有当 name 不为 null 时,才会去调用 name.length()// 如果没有短路,当 name 为 null 时调用 length() 会抛出 NullPointerException}

如果你去掉&&左边的判断,程序就可能崩溃。所以短路特性非常实用。

逻辑运算符的优先级

!>&&>||。如果不确定,就用括号把条件分组,既清晰又安全。

booleanresult=(a>5)&&(b<10)||(c==0);// 加上括号明确优先级,建议总是这样写booleanresult2=((a>5)&&(b<10))||(c==0);

5. 位运算符

位运算符操作的是整数在二进制层面上的位(bit)。它们在实际开发中不如前面几种常用,但在一些场景(比如权限控制、高效计算、网络协议解析)中很关键。初学阶段了解即可,不必深究。

运算符含义示例(二进制)
&按位与5 & 3= 1(0101 & 0011 = 0001)
``按位或
^按位异或5 ^ 3= 6(0101 ^ 0011 = 0110)
~按位取反~5= -6(补码运算,不深入)
<<左移5 << 1= 10(相当于乘以 2)
>>右移5 >> 1= 2(相当于除以 2 取整)
>>>无符号右移忽略符号位右移(正数同>>

如果你现在看不懂这些,完全没关系。位运算符不是必须马上掌握的,我们会在以后的实际应用中(比如权限组合)再具体介绍。你只需要知道 Java 有这个能力就行。


6. 运算符优先级

当多个运算符混在一起时,需要确定计算顺序。Java 有明确的优先级规则,但不必死记硬背,因为最稳妥的做法是使用小括号()来明确顺序

不过有一个大致的优先级印象还是有帮助的,从高到低:

  1. ()括号
  2. ++--(前缀)、!~+(正号)、-(负号)
  3. */%
  4. +-(加减)
  5. <<>>>>>
  6. <<=>>=
  7. ==!=
  8. &
  9. ^
  10. |
  11. &&
  12. ||
  13. ?:(三元运算符,我们下一篇会学)
  14. 赋值运算符(=+=等)

最佳实践:不要依赖优先级,多用括号。括号不仅让计算顺序明确,也让代码更易读。

// 不清晰intresult=a+b*c-d/e;// 清晰明了intresult=a+(b*c)-(d/e);

7. 综合示例

写一个小程序,演示我们学到的运算符:

packagecom.example.demo;/** * 演示各类运算符的用法 */publicclassOperatorDemo{publicstaticvoidmain(String[]args){// ---- 1. 算术运算 ----inta=10,b=3;System.out.println("a + b = "+(a+b));// 13System.out.println("a - b = "+(a-b));// 7System.out.println("a * b = "+(a*b));// 30System.out.println("a / b = "+(a/b));// 3,整数除法截断System.out.println("a % b = "+(a%b));// 1,10除以3余1// ---- 2. 自增自减 ----intcount=0;count++;// count 变成 1++count;// count 变成 2System.out.println("count = "+count);// 2// 前置和后置的返回值区别intx=5;inty=x++;// y = 5, x = 6System.out.println("x = "+x+", y = "+y);// x=6, y=5intp=5;intq=++p;// p = 6, q = 6System.out.println("p = "+p+", q = "+q);// p=6, q=6// ---- 3. 复合赋值 ----inttotal=100;total+=50;// total = 150total*=2;// total = 300total%=7;// 300 % 7 = 6 (7*42=294, 余6)System.out.println("total = "+total);// 6// ---- 4. 关系运算 ----booleanisEqual=(a==b);// falsebooleanisGreater=(a>b);// trueSystem.out.println("isEqual = "+isEqual);System.out.println("isGreater = "+isGreater);// ---- 5. 逻辑运算 ----intage=20;booleanisAdult=age>=18;booleanhasTicket=true;booleancanEnter=isAdult&&hasTicket;// true && true = trueSystem.out.println("可以进入?"+canEnter);// 短路示例Stringname=null;// 下面的表达式不会抛出空指针,因为左边为 false,右边不会执行if(name!=null&&name.length()>0){System.out.println("名字长度:"+name.length());}else{System.out.println("名字为空或null");}// ---- 6. 位运算简单示例(了解即可) ----intflags=5;// 二进制 0101intmask=3;// 二进制 0011intresult=flags&mask;// 0001 = 1System.out.println("flags & mask = "+result);}}

8. 常见陷阱与注意事项

  • 整数除法截断:别指望7 / 2给你 3.5,它会给你 3。如果需要小数,记得把其中一个数转成浮点数(例如7 / 2.0)。
  • 比较浮点数:因为浮点数精度问题,不要直接用==比较两个浮点数是否相等。应该判断它们的差的绝对值是否小于一个很小阈值(比如0.000001)。
  • 短路逻辑:巧妙利用短路可以避免一些异常,但也要注意,如果右边的表达式有副作用(比如改变变量值),短路会导致它不执行,这可能会埋下 bug。
  • ==equals:对基本类型用==,对字符串等引用类型用equals()比较内容。我们会专门在字符串那一篇详细讲。

今天的总结

今天我们学习了 Java 中的五大类运算符:

  • 算术运算符+-*/%++--
  • 赋值运算符=以及复合赋值+=-=
  • 关系运算符==!=><>=<=
  • 逻辑运算符&&||!(注意短路特性)
  • 位运算符:入门了解&|^~<<>>(进阶再深入)

你还知道了运算符优先级的概念,以及用括号提高可读性的习惯。

这些运算符就像是你的工具箱里的扳手、螺丝刀——单独看都很简单,但组合起来就能完成复杂的任务。下一篇文章,我们会用这些运算符搭建程序逻辑的第一个真正“决策”工具:if 和 switch


动手试试

  1. 写一段代码,计算一个三位数(比如 456)的个位、十位、百位数字,分别用变量表示,并打印出来。提示:用/%运算符。
  2. 写一个判断闰年的表达式:年份能被 4 整除但不能被 100 整除,或者能被 400 整除。把表达式写出来,然后用几个年份(如 2024、2100、2000)验证一下。
  3. 试试把double类型的两个小数(如 0.1 和 0.2)相加,打印结果,观察是不是精确的 0.3?如果不是,想想为什么。

我们下一篇见。😃

📌 获取本系列示例代码请访问 GitCode。