Java程序设计基础笔记 • 【第3章 运算符与表达式】

简介: 3.1 运算符(一)3.1.1 赋值运算符3.1.2 算数运算符3.1.3 复合运算符3.1.4 实践练习(一)3.1.5 实践练习(二)3.2 运算符(二)3.2.1 关系运算符3.2.2 逻辑运算符3.2.3 三母运算符3.2.4 实践练习3.3 运算符优先级和表达式3.3.1 表达式3.3.2 运算符和优先级3.3.3 实践练习3.4 数据类型转换3.4.1 自动类型转换3.4.2 强制类型转换3.4.3 实践练习(一)3.4.4 实践练习(二)总结:

3.1 运算符(一)

(1)运算符,顾名思义就是用于计算的符号。


(2)Java 语言中的运算符


①按功能分为:赋值运算符、算术运算符、关系运算符和逻辑运算符


②按操作数的个数分类:单目运算符、双目运算符、三目运算符


(3)使用运算符时,要关注下列三个方面:


①运算符的目:运算符能连接操作数的个数称为运算符的目


②运算符的优先级:优先级是指在一个表达式中出现多个不同运算符,在进行计算时运算符执行的先后次序。


③运算符的结合方向:结合方向又称为结合性,是指当一个操作数连接两个同一优先级的运算符时,按运算符的结合性所规定的结合方向处理。


3.1.1 赋值运算符


赋值运算符为“=”Java语言中最简单,也是最常用的运算符。

赋值运算用于将赋值运算符右侧表达式的结果赋予赋值运算符左侧的变量

int english = 92;

赋值运算符具有自右向左的结合性

int a,b,c;      //同时声明三个变量
a = b = c = 1;  //自右向左赋值


注意:赋值运算符的左侧只能为一个变量,而右侧可以是变量、常量或表达式。


3.1.2 算数运算符


6.png


注意:

如果参与运算的数值都是整数,则“/”完成的是整除运算,如5/2 的值是2 而非2.5。

模运算“%”是进行除法运算后取余数,参与运算的必须是整数。



示例:使用算术运算符实现两个数字的基本四则运算。


7.png


​int  num1 = 5;
int  num2 = 3;
int  result;
result = num1+num2; // 加法运算
System.out.printf("%d + %d的结果是 %d\n",num1,num2,result);
result = num1-num2; // 减法运算
System.out.printf("%d - %d的结果是 %d\n",num1,num2,result);
result = num1*num2; // 乘法运算
System.out.printf("%d * %d 的结果是 %d\n",num1,num2,result);
result = num1/num2; // 除法运算
System.out.printf("%d / %d的结果是 %d\n",num1,num2,result);
result = num1%num2; // 求余运算
System.out.printf("%d %% %d的结果是 %d\n",num1,num2,result);


(1)在算术运算符中,还存在两个较为独特的单目运算符,分别是自增和


++变量名 或 变量名++
--变量名 或 变量名--


(2)自增和自减运算符分别用于使变量值自增1自减1


8.png


3.1.3 复合运算符


在Java语言中,可以将赋值运算符和算术运算符进行组合,从而形成复合赋值运算符,用于对变量自身执行算术运算。


9.png

当需要对变量自身进行算术运算时,建议使用复合赋值运算符,效率要远高于算术运算符。

复合赋值运算符的结合性自右向左。

    例如:

    int a=5;

    a+=a+=5;// 等效于a=a+(a+5)

执行完毕后,变量a 的值为15。



3.1.4 实践练习(一)

3.1.5 实践练习(二)

 

3.2 运算符(二)

3.2.1 关系运算符


关系运算符用于比较两个变量或表达式的值的大小关系

在Java 中,关系运算结果值为bool 类型,包括true”或“false


10.png


示例:使用关系运算符实现两个数字之间的大小比较。


11.png


int num1 = 88;
int num2 =  100;
boolean result;
result = num1>num2;
System.out.printf("%d > %d的结果为:%b\n",num1,num2,result);
result = num1>=num2;
System.out.printf("%d >= %d的结果为:%b\n",num1,num2,result);
result = num1<num2;
System.out.printf("%d < %d的结果为:%b\n",num1,num2,result);
result = num1==num2;
System.out.printf("%d == %d的结果为:%b\n",num1,num2,result);
result = num1!=num2;
System.out.printf("%d != %d的结果为:%b\n",num1,num2,result);


3.2.2 逻辑运算符


使用关系运算符可以比较程序中两个值的大小关系,但在程序中经常需要从多个比较关系中得到综合判断的结果


12.png

示例:要想进入微软亚洲研究院工作,必须是研究生毕业,且从事软件开发两年以上的工作经验



13.png


如果要描述入职微较亚洲研究院的条件,则伪代码为:


(学历>=硕士)&&(工作年限>=两年)


如果入职微软亚洲研究院的条件变为“学历为硕士以上或工作年限两年以上”,则伪代码为:


(学历>=硕士)(工作年限>=两年)


如果入职微软亚洲研究院的条件变为“学历不能为硕士以下”,则伪代码为:


!(学历<硕士)


int degree, workyear;
degree = 3; //degree  1代表本科,2代表硕士,3代表博士
workyear = 3;
boolean result=(degree>=2)&&(workyear>=2);
System.out.println("博士并且工作3年的入职评判结果为:"+result);
degree = 2;
workyear = 1;
result = (degree >= 2) && (workyear >= 2);
System.out.println ("硕士并且工作1年的入职评判结果为:" + result);
degree = 1;        
workyear = 1;
result = (degree >= 2) && (workyear >= 2);
System.out.println("本科并且工作1年的入职评判结果为:" + result);


3.2.3 三母运算符


三目运算符可以快速的帮我们实现条件的判断,语法如下:


布尔表达式?表达式1:表达式2


条件表达式的结果由布尔表达式决定,如果布尔表达式的值为true,则返回表达1的值,否则返回表达式2的值。


示列:使用三目运算符实现成年与否的判断


14.png


Scanner sc = new Scanner(System.in);
System.out.println("请输入您的年龄");
int age = sc.nextInt();
System.out.println(age>=18?"成年":"未成年");


注意:

  • 条件运算符的优先级低于关系运算符和算术运算符,高于赋值运算符。
  • JAVA中条件运算表达式中的关系表达式值的类型必须为布尔类型,只能是truefalse
  • 条件运算符的结合性是右结合性。


3.2.4 实践练习

 

3.3 运算符优先级和表达式


3.3.1 表达式


表达式和运算符:

计算机程序在处理数据时会进行大量的计算,而数据的运算则需要借助运算符和表达式来完成

表达式是指由操作数和运算符组成的用于完成某种运算功能的语句


15.png其中Y、XZ10 称为


操作数,=、*、+ 称为运算符。


3.3.2 运算符和优先级


Java语言中进行表达式求值时,同一优先级的运算符,运算次序由结合性决定,不同优先级的运算符,运算次序由优先级决定。


16.png

3.3.3 实践练习

 

3.4 数据类型转换


  • 不同类型的数据在进行混合运算时需要进行类型转换,即将不同类型的数据转换为同种类型的数据后再进行计算。
  • 针对于值类型的数据,类型转换主要包括以下两种形式:自动类型转换强制类型转换


3.4.1 自动类型转换


条件1:满足自动类型转换的条件

两种类型要兼容:数值类型(整型和浮点型)互相兼容

目标类型大于源类型: 例如:double 型大于 int

条件2操作数向大操作数类型转换,计算结果也为表达式中大操作数的类型


17.png


18.png


示例:实现自动类型转换

//自动转换示例3
int a3 = 10;
long b3 = 1000;
long result3 = a3 + b3;
System.out.println(result3);
//自动转换示例4
byte a4 = 10;
char b4 = 'a'; //字母a对应为97
//a4、b4将转换为int类型,最终运算的结果为int类型
int result4 = a4 + b4; 
System.out.println(result4);


3.4.2 强制类型转换


强制类型转换可以将大数据类型转化为小数据类型(如将double转换为int),在转换过程中会丢失数据的精度。

语法:


(目标数据类型) 表达式;


示例:求半径为5的圆的周长,结果取整数

19.png


public class TypeTran {
  public static void main(String[] args) {
    int r = 5;
    int round = (int)(2*3.14*r);//求圆的周长,强制类型转换后会丢失精度
    System.out.println("半径为"+r+"的圆的周长为:"+round);
  }
}


3.4.3 实践练习(一)

3.4.4 实践练习(二)

 

总结:


在Java中,运算符按功能分为:赋值运算符、算术运算符、关系运算符和逻辑运算符。

关系运算符运算后的结果为boolean类型。

逻辑运算符可以连接多个关系运算符,它的操作数与结果均为boolean类型。

数据类型转换分为自动类型转换和强制类型转换。

数据类型转换是为方便不同类型的数据之间进行计算,发生自动类型转换有一定的条件。


相关文章
|
27天前
|
安全 Java 编译器
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
|
27天前
|
Java 开发工具 Android开发
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
|
29天前
|
Java API 开发者
Java中的Lambda表达式与Stream API的协同作用
在本文中,我们将探讨Java 8引入的Lambda表达式和Stream API如何改变我们处理集合和数组的方式。Lambda表达式提供了一种简洁的方法来表达代码块,而Stream API则允许我们对数据流进行高级操作,如过滤、映射和归约。通过结合使用这两种技术,我们可以以声明式的方式编写更简洁、更易于理解和维护的代码。本文将介绍Lambda表达式和Stream API的基本概念,并通过示例展示它们在实际项目中的应用。
|
1月前
|
Java API 开发者
Java中的Lambda表达式:简洁代码的利器####
本文探讨了Java中Lambda表达式的概念、用途及其在简化代码和提高开发效率方面的显著作用。通过具体实例,展示了Lambda表达式如何在Java 8及更高版本中替代传统的匿名内部类,使代码更加简洁易读。文章还简要介绍了Lambda表达式的语法和常见用法,帮助开发者更好地理解和应用这一强大的工具。 ####
|
26天前
|
Java 数据库连接 编译器
Kotlin教程笔记(29) -Kotlin 兼容 Java 遇到的最大的“坑”
Kotlin教程笔记(29) -Kotlin 兼容 Java 遇到的最大的“坑”
46 0
|
28天前
|
安全 Java API
Java中的Lambda表达式:简化代码的现代魔法
在Java 8的发布中,Lambda表达式的引入无疑是一场编程范式的革命。它不仅让代码变得更加简洁,还使得函数式编程在Java中成为可能。本文将深入探讨Lambda表达式如何改变我们编写和维护Java代码的方式,以及它是如何提升我们编码效率的。
|
1月前
|
安全 Java API
Java中的Lambda表达式与Stream API的高效结合####
探索Java编程中Lambda表达式与Stream API如何携手并进,提升数据处理效率,实现代码简洁性与功能性的双重飞跃。 ####
26 0
|
5天前
|
Java
Java—多线程实现生产消费者
本文介绍了多线程实现生产消费者模式的三个版本。Version1包含四个类:`Producer`(生产者)、`Consumer`(消费者)、`Resource`(公共资源)和`TestMain`(测试类)。通过`synchronized`和`wait/notify`机制控制线程同步,但存在多个生产者或消费者时可能出现多次生产和消费的问题。 Version2将`if`改为`while`,解决了多次生产和消费的问题,但仍可能因`notify()`随机唤醒线程而导致死锁。因此,引入了`notifyAll()`来唤醒所有等待线程,但这会带来性能问题。
Java—多线程实现生产消费者
|
7天前
|
安全 Java Kotlin
Java多线程——synchronized、volatile 保障可见性
Java多线程中,`synchronized` 和 `volatile` 关键字用于保障可见性。`synchronized` 保证原子性、可见性和有序性,通过锁机制确保线程安全;`volatile` 仅保证可见性和有序性,不保证原子性。代码示例展示了如何使用 `synchronized` 和 `volatile` 解决主线程无法感知子线程修改共享变量的问题。总结:`volatile` 确保不同线程对共享变量操作的可见性,使一个线程修改后,其他线程能立即看到最新值。