第5章-运算符
概述
运算符是编程语言中非常重要的语法
使用运算符将字面量、变量等元素组合在一起后,称之为表达式;并且,表达式也可以再使用运算符进行组合,形成新表达式,如(5>3)&(10<20)|isSuperMan
一般多针对8种基本数据类型和字符串类型
变量定义完成后,一般都会与其他变量进行一起计算,以完成程序的逻辑;其中的计算就需要用到各种运算符
常用运算符
算术运算符
主要用于进行传统数学计算,进行数学计算,针对的数据类型一般为整数型、浮点型等数据类型
运算符:+、-、*、/、%、++、--
应用实例
实例1,基本算术运算,加、减、乘、除和取余;
注意:操作数如果是整数,则除法是整除
package com.bjpowernode.demo;
/**
* 基本算术运算
*/
public class OperatorDemo {
public static void main(String[] args) {
//定义变量
int first = 10;
int second = 3;
//算术运算
System.out.println(first + second); //加
System.out.println(first - second); //减
System.out.println(first * second); //乘
System.out.println(first / second); //除,注意是整除
System.out.println(first % second); //取余
}
}实例2,自增1和自减1
注意:在变量前和在变量后效果不同
在前:先进行自增或自减,当前代码行使用自增或自减后的值
在后:当前代码行使用自增前或自减前的值,下一行代码使用自增或自减后的值
package com.bjpowernode.demo;
/**
* 自增、自减算术运算
*/
public class OperatorDemo {
public static void main(String[] args) {
//定义变量
int first = 1;
//自增1,分别注释,对比查看效果
System.out.println(++first); //在前
System.out.println(first++); //在后
//定义变量
int second = 1;
//自减1,分别注释,对比查看效果
System.out.println(--second); //在前
System.out.println(second--); //在后
}
}
【练习】
- 练习实例内容,完成代码编写,掌握基本算术运算符的使用、自增1和自减1在前和在后的差异
- 编写程序,计算任意三位整数各位之和,如整数123各位之和是1+2+3,结果为6,234各位之和是2+3+4,结果为9
赋值运算符
主要用于对变量进行赋值;其中=可用于基本数据类型变量和引用数据类型变量赋值,其余的主要针对数值型、浮点型等基本数据类型
运算符:=、+=、-=、*=、/=、%=
变量定义时,直接赋值使用的等于号”=“就是赋值运算符
结合算术运算符中的+、-、*、/、%,可以组织更加简便的赋值运算符
应用实例
实例1,赋值运算符
package com.bjpowernode.demo;
/**
* 赋值算术运算
*/
public class OperatorDemoDemo {
public static void main(String[] args) {
//定义变量,使用赋值运算符
long first = 10;
//其他赋值运算符
//加等于
first += 3;//相当于first = first +3;
System.out.println(first);
//减等于
first = 10; //重新设置变量值
first -= 3;
System.out.println(first);
//乘等于
first = 10; //重新设置变量值
first *= 3;
System.out.println(first);
//除等于
first = 10; //重新设置变量值
first /= 3;
System.out.println(first);
//取余等于
first = 10; //重新设置变量值
first %= 3;
System.out.println(first);
}
}实例2,first += 3和first = first + 3两种方式的差别;一般认为没有差别,但使用字面量参与运算时,还是有小差异
package com.bjpowernode.demo;
/**
* 赋值算术运算中first+=3与first=first+3的区别
*/
public class OperatorDemoDemo {
public static void main(String[] args) {
//定义变量,使用赋值运算符
byte first = 10;
//赋值运算符,简写方式
first += 3; //正常,字面量3默认是int类型,但作为赋值运算符,会进行自动类型转型
System.out.println(first);
//算术运算符配置赋值运算符,非简写方式
first = first + 3; //异常,因为字面量默认是int类型
System.out.println(first);
}
}
【练习】
- 练习演示内容,完成代码编写;掌握赋值运算符的使用
- 编写程序,要求如下
- 定义long类型变量longVariable,赋初始值为10
- 使用赋值运算符在原值上加50,并输出变量
- 使用赋值运算符在原值上减25,并输出变量
- 使用赋值运算符在原值上乘2,并输出变量
- 使用赋值运算符在原值上除3,并输出变量
- 使用赋值运算符在原值上对10进行取余,并输出变量
关系运算符
多用于数值的比较,一般多用于数值型、浮点型的数值比较;其中的==也用于引用数据类型的比较,但比较的是地址
运算符:>、>=、<、<=、==、!=
关系运算符计算后的返回值为boolean型,即值只为true或false
注意:==与=是完全不同的
特殊的==运算符
- 即可比较8种基本数据类型,也可比较引用数据类型
- 比较基本数据类型,比较实际值
- 比较引用数据类型,比较引用在堆中指向的地址是否相同(先记住,后面还有讲解)
应用实例
实例1,关系运算符;注意:下面使用提int类型,使用byte、short、long、float、double有类似的效果
package com.bjpowernode.demo;
/**
* 关系运算符
*/
public class OperatorDemoDemo {
public static void main(String[] args) {
//定义变量
int first = 10; //换其他值尝试效果,如20、30
int second = 10; //换其他值尝试效果,如25、35
//关系运算
System.out.println(first > second);
System.out.println(first >= second);
System.out.println(first < second);
System.out.println(first <= second);
System.out.println(first == second);
boolean result = first != second;
System.out.println(result);
}
}
【练习】
- 练习演示内容,完成代码编写;掌握关系运算符的使用
逻辑运算符
主要用于boolean类型的比较
逻辑运算符计算后的返回值还是boolean型,即值只为true或false
运算符:见下表
逻辑运算符中的与、或,分为短路和非短路两种,略有差异
应用实例
实例1,正常使用逻辑运算符
package com.bjpowernode.demo;
/**
* 逻辑运算符
*/
public class OperatorDemoDemo {
public static void main(String[] args) {
System.out.println("-----字面量逻辑运算-----");
//字面量逻辑运算
//与
System.out.println(true & true);
System.out.println(true & false);
System.out.println(false & true);
System.out.println(false & false);
//或
System.out.println(true | true);
System.out.println(true | false);
System.out.println(false | true);
System.out.println(false | false);
//非
System.out.println(!true);
System.out.println(!false);
//异或
System.out.println(true ^ true);
System.out.println(true ^ false);
System.out.println(false ^ true);
System.out.println(false ^ false);
System.out.println("-----变量逻辑运算-----");
//变量逻辑运算
boolean first = true;
boolean second = false;
//与
System.out.println(first & second);
//或
System.out.println(first | second);
//非
System.out.println(!first);
System.out.println(!second);
//异或
System.out.println(first ^ second);
System.out.println("-----表达式逻辑运算-----");
//表达式逻辑运算
int one = 5;
int two = 3;
//与
System.out.println((one > two) & (10 < 20));
//或
System.out.println((one > two) | (one != 0) | (two == 5));
//非
System.out.println(!(one > two));
System.out.println(!(one < two));
//异或
System.out.println((one < two) ^ (one > two));
}
}实例2,逻辑与(&)与短路与(&&)区别;|和||类似
package com.bjpowernode.demo;
/**
* 逻辑与(&)和短路与(&&)区别
*/
public class OperatorDemoDemo {
public static void main(String[] args) {
//逻辑与;注意,当&左边为false时,由于是与运算,整个表达式一定为假,继续计算后面的表达式没有意义;但此时由于是逻辑与,还是【会】继续计算++testVariable<100,并且testVariable【会】进行自增1
int testVariable = 0;
boolean result = false & (++testVariable < 100);
System.out.println(testVariable);
//短路与;注意,当&&左边为false时,由于是与运算,整个表达式一定为假,继续计算后面的表达式没有意义;此时【不会】继续计算++testVariable<100,testVariable【不会】进行自增1,效率更高
testVariable = 0;
result = false && (++testVariable < 100);
System.out.println(testVariable);
}
}
【练习】
- 练习实例内容,完成代码编写;掌握逻辑运算符的使用,掌握逻辑与(或)与短路与(或)差异
位运算符【扩展】
主要用于整数型数据进行运算
会先将十进制转换为二进制,然后按二进制位进行运算
运算符:&、|、~、^、<<、>>、>>>
应用实例
实例1,正常使用
package com.bjpowernode.demo;
/**
* 位运算符
*/
public class OperatorDemoDemo {
public static void main(String[] args) {
//变量定义
int first = 3;
int second = 5;
//输出二进制形式,Integer为包装类,使用其toBinaryString方法输出二进制字符串形式
System.out.println(Integer.toBinaryString(first)); //输出为11,前面补齐0,即二进制的00000011
System.out.println(Integer.toBinaryString(second)); //输出为101,前面补齐0,即二进制的00000101
//位运算
//按位与
int result = first & second;
System.out.println(Integer.toBinaryString(result)); //按位与后为1,前面补齐0,即二进制的00000001
//按位或
result = first | second;
System.out.println(Integer.toBinaryString(result)); //按位或后为111,前面补齐0,即二进制的00000111
//按位非
result = ~second;
System.out.println(Integer.toBinaryString(result)); //按位非后为010,前面补齐0,即二进制的00000010
//按位异或
result = first ^ second;
System.out.println(Integer.toBinaryString(result)); //按位非后为110,前面补齐0,即二进制的00000110
//左移2位
result = first << 2;
System.out.println(Integer.toBinaryString(result)); //左移后为1100,前面补齐0,即二进制的00001100
//右移2位
result = first >> 2;
System.out.println(Integer.toBinaryString(result)); //右移后为0,前面补齐0,即二进制的00000000
}
}
【练习】
- 运行示例代码,了解位运算符的使用
条件运算符
主要用于简单真假逻辑计算,类似于常见的二选一
运算符:? :
也称之为三目运算符
与后面学习的if...else...相类似,可以理解为一种简写方式
格式:条件表达式?表达式1:表达式2,其中
- ?与:,是条件运算符关键字
- 条件表达式,问号(?)前面的是条件表达式,表达式计算后的返回值必须为boolean类型
- 如果条件表达式计算结果为true,执行表达式1
- 如果条件表达式计算结果为false,执行表达式2
- 注意:表达式1、表达式2可以是字面量、表达式,且计算完成后的结果必须为相同类型
另外,这3个表达式,一般都不能超过一行语句,如果超过,换if...else...实现
常见使用方式
- 二选一,如isSuperMan == true ? "超人":"普通人";
- 多选一,需要使用嵌套条件运算符,如age<18?"少年":(age<30?"青年":"老年");
示例:isSuperMan == true ? "超人":"普通人"
应用实例
实例1,二选一
package com.bjpowernode.demo;
/**
* 条件运算符
*/
public class OperatorDemoDemo {
public static void main(String[] args) {
//变量定义
int age = 16; //尝试修改值为15、19
//使用条件运算符
String result = age >= 18 ? "成年人" : "未成年人";
//输出
System.out.println(result);
}
}实例2,三选一
package com.bjpowernode.demo;
/**
* 条件运算符
*/
public class OperatorDemoDemo {
public static void main(String[] args) {
//变量定义
int age = 18; //尝试修改值为15、19、35
//使用条件运算符
String result = age <= 18 ? "少年" : (age <= 30 ? "青年" : "老年");
//输出
System.out.println(result);
}
}
【练习】
- 练习实例内容,完成代码编写;掌握条件运算符的使用
- 编写程序,判读整数是奇数还是偶数,要求如下:
- 定义一个int类型变量,并赋值,可以是任意整数,如10、11
- 结合算术运算符、条件运算符,判断变量值是奇数,还是偶数,并输出
- 如int intVariable = 10;,则输出”偶数”;如果int intVariable = 11;,则输出“奇数“
字符串连接运算符
主要用于字符串连接,通常可实现字符串与字符串、8种基本数据类型、对象进行连接,形成一个新的字符串
运算符:+
应用实例
实例1,字符串连接字符串
package com.bjpowernode.demo;
/**
* 字符串连接运算符,字符串连接字符串
*/
public class OperatorDemoDemo {
public static void main(String[] args) {
//变量定义
String firstName = "尼古拉斯";
String lastName = "赵四";
//使用字符串连接运算符
String fullName = firstName + "." + lastName;
//输出
System.out.println(fullName);
}
}实例2,字符串连接基本数据类型
注意:字符串连接运算符+也遵守从左到右的计算顺序,字符串所在位置左边还是会进行普通的算术运算
package com.bjpowernode.demo;
/**
* 字符串连接运算符,字符串连接基本数据类型
*/
public class OperatorDemoDemo {
public static void main(String[] args) {
//变量定义
String name = "王大拿";
int baseSalary = 5000; //基本工资
int overTimeHours = 20; //加班小时
double overTimeHourWage = 10.5; //加班时薪
//输出工资信息
//方式1,拼接的字符串name之前没有基本数据类型,后面所有+处理都转字符串
System.out.println(name + "的基本工资是:" + baseSalary + ",加班小时数:" + overTimeHours + ",加班时薪:" + overTimeHourWage + ",实发工资:" + baseSalary + overTimeHours * overTimeHourWage);
//方式2,拼接的字符串"是"之前有基本数据类型,前面所有+都处理成算术运算,,后面所有+处理都转字符串
System.out.println(baseSalary + overTimeHours * overTimeHourWage + "是" + name + "的实发工资,他的基本工资是:" + baseSalary + ",加班小时数:" + overTimeHours + ",加班时薪:" + overTimeHourWage);
}
}
【练习】
- 练习实例内容,完成代码编写;掌握字符串连接运算符的使用,掌握字符串连接各种数据类型的特点
其他运算符
- instanceof,主要用于检查对象是否是某种类型,在面向对象阶段会讲解
- new,主要用于根据类生成对象,在面向对象阶段会讲解
优先级
优先级排行
- ++,- -
- 括号
- *,/ ,% (同一优先级,从左至右)
- +,- (同一优先级,从左至右)
注意点:同一优先级运算符的运算顺序为:从左至右,运算复杂的时候要一步步拆解运算。
建议
- 不要把一个表达式写得过于复杂,可以分步来写
- 少利用优先级特点,可读性差
- 多使用括号()来控制运算顺序
注意事项
- 所有运算符都是半角字符,要注意与中文的全角字符区分
- 所有运算符都是关键字,不能用于自定义标识符
System.in
标准输入流,用于从控制台(命令行)接收输入内容
但,使用System.in读取数据都为字节,不方便快速转换为8种基本数据类型
Java中提供了Scanner类,使用System.in进行包装,能实现各种数据从控制台快速读取
其特点是:
- 读取时,程序会中断等待从控制台读取完成,读取完成后,程序再继续执行
- 读取完成的标志,是在控制台输入回车
Scanner对象有多个方法
- next,接收输入一行文本,即String类型数据
- nextInt,接收输入一个int类型数据
- nextDouble,接收输入一个double类型数据
- nextBoolean,接收输入一个boolean类型数据
- ...
应用实例
实例1,接收控制台输入学生信息
package com.bjpowernode.demo;
import java.util.Scanner;
/**
* Scanner
*/
public class ScannerDemo {
public static void main(String[] args) {
//定义变量
int no; //学号,整型
String name; //姓名,字符串类型
double weight; //体重,double类型
boolean isMale; //是否为男性,boolean类型
//定义Scanner对象,使用System.in做构造参数
Scanner scanner = new Scanner(System.in);
//使用scanner对象读取数据到变量,并结合标准输出进行提示,提升体验
System.out.println("-----请输入学生信息-----");
System.out.print("请输入学号:");
no = scanner.nextInt(); //读取学号
System.out.print("请输入姓名:");
name = scanner.next(); //读取姓名
System.out.print("请输入体重:");
weight = scanner.nextDouble(); //读取体重
System.out.print("是否为男性:");
isMale = scanner.nextBoolean(); //读取是否为男性
//输出输入内容
System.out.println("-----你输入的学生信息如下-----");
System.out.println("学号:" + no);
System.out.println("姓名:" + name);
System.out.println("体重:" + weight);
System.out.println("是否为男性:" + isMale);
}
}
【练习】
- 练习实例内容,完成代码编写
- 编写程序,要求如下
- 定义boolean类型变量isLearningTime,用于保存是否为上课时间
- 接收输入是否为上课时间,输入的为字符串,如果输入”是“,isLearningTime赋值为true,如果输入其他内容,isLearningTime赋值为false
- 输出isLeaningTime的值
实战和作业
提问
下面的代码正确吗?为什么?可以使用什么运算符替代?
//变量定义
byte variable = 5;
//算术运算
variable = variable + 10;下面的代码输出什么?如果想实现一个算术运算输出,怎么改?
//变量定义
int first = 10;
double second = 3.0;
//输出
System.out.println(first + "+" + second + "=" + first + second);
编写程序,接收输入两个数,分别计算这两个数相加、相减、相乘、相除的结果,并输出
编写程序,接收输入一个整数,判断其是正数、负数,还是0,如:
- 输入-3,输出"-3是负数。"
- 输入3,输出"3是正数。"
- 输入0,输出"0是零。"
编写程序,实现两个变量值交换,要求
- 从控制台接收两个变量的值,变量名分别为first、second,然后输出
- 交换两个变量的值,然后输出
- 【扩展】可尝试不使用第3个变量进行first、second两个变量值交换