一、运算符和表达式
什么叫运算符?
对字面量或者变量进行操作的 符号
b.什么是表达式?
用 运算符把字面量或者变量连接起来, 符合Java语法的式子就可以成为表达式。
不同运算符连接的表达式体现的是不同类型的表达式。
二、六种运算符
算术运算符
符号 | 作用 |
+ | 加 |
- | 减 |
* | 乘 |
/ | 除 |
% | 取模、取余 |
1.小数参与运算时,结果有可能是不精确的;
2.整数参与计算,结果只能得到整数;
类型转换的分类
隐式转换 (自动类型提升):取值范围小的数值转换为取值范围大的数值
隐式转换的两种提升规则:1.取值范围小的和取值范围大的进行运算,小的会先提升为大的,再进行运算;2.byte、short、char三种类型的数据在运算的时候,都会直接先提升为int,然后再进行计算。
强制转换:取值范围大的数值转换为取值范围小的数值
格式:目标数据类型 变量名 = (目标数据类型)被强制的数据
注:数据如果过大就会导致结果出错
字符串的“+”操作
1.当“+”操作中出现字符串时,这个“+”是字符串连接符,而不是算术运算符了。会将前后的数据进行拼接,并产生一个新的字符串。
例如:“123”+123 ---->结果为:“123123”
2.连续进行“+”操作时,从左到右逐个执行。
例如:1+99+“年” ---> 结果为:“100年”
字符的“+”操作
当 字符+字符或 字符+数字时,会把字符通过ASCII码表查询到对应的数字再进行计算。
练习
需求:键盘录入一个三位数将其拆分为个位、十位、百位,打印在控制台
公式总结:
个位:数值%10
十位:数值/10%10
百位:数值6100%10
千位:数值/1000%10;
....
代码如下
import java.util.Scanner;
public class ArithmeticoperatorDem01 {
public static void main(String[] args) {
// 键盘录入一个三位数,获取其中的个位、十位、百位
// 1.键盘录入
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个三位数:");
int number = sc.nextInt();
// 2.获取个位、十位、百位
// 公式:
// 个位:数字%10
// 十位:数字/10%10
// 百位:数字/10/10%10
// ...
int ge = number % 10;
int shi = number / 10 % 10;
int bai = number / 10 / 10 % 10;
System.out.println("个位是:"+ge);
System.out.println("十位是:"+shi);
System.out.println("百位是:"+bai);
}
}
运行结果:
![](https://i-blog.csdnimg.cn/blog_migrate/c628efa12cabb9357a8cbb2462e91dd7.png)
自增自减运算符
符号 | 作用 | 说明 |
++ | 加 | 变量的值加1 |
-- | 减 | 变量的值减1 |
注意事项:
++和--既可以放在变量的前边,也可以放在变量的后边。
两种用法:
1.单独使用:++和--无论是放在变量的前边还是后边,单独写一行结果是一样的。
2.参与计算:a++是先用后加,++a是先加后用。
代码演示如下:
public class test04 {
public static void main(String[] args) {
int x = 10;
//后++:先用后加
//先把x变量中的值拿出来用,赋值给y,然后再进行自增
//赋值给y的是自增前的
int y = x++;
//先++:先加后用
//先把x进行自增,然后把自增后的结果赋值给左边的变量
//先把x自增,变成12,然后再把自增之后的12赋值给z
int z = ++x;
System.out.println("x:" + x);
System.out.println("y:" + y);
System.out.println("z:" + z);
}
}
运行结果为:
![](https://i-blog.csdnimg.cn/blog_migrate/007a66333b1f131e343511a51b80af2f.png)
赋值运算符
符号 | 作用 | 说明 |
= | 赋值 | int a=10,将10赋值给变量a |
+= | 加后赋值 | a+=b,将a+b的值给a |
-= | 减后赋值 | a-=b,将a-b的值给a |
*= | 乘后赋值 | a*=b,将a×b的值给a |
/= | 除后赋值 | a/=b,将a÷b的商给a |
%= | 取余后赋值 | a%=b,将a÷b的余数给a |
注意事项:扩展的赋值运算符隐含了强制类型转换
关系运算符(比较运算符)
符号 | 说明 |
== | a==b,判断a和b的值是否相等,成立为true,不成立为false |
!= | a!=b,判断a和b是否不相等,成立为true,不成立为false |
> | a>b,判断a是否大于b,成立为true,不成立为false |
>= | a>=b,判断a是否大于等于b,成立为true,不成立为false |
< | a<b。判断a是否小于b,成立为true,不成立为false |
<= | a<=b,判断a是否小于等于b,成立为true,不成立为false |
注意事项:关系运算符的结果都是boolean类型,要么是true,要么是false。
千万不要把“==”误写成“=”。
逻辑运算符
符号 | 作用 | 说明 |
& | 逻辑与(且) | 并且,两边都是真,结果才是真 |
| | 逻辑或 | 或者,两边都为假,结果才是假 |
^ | 逻辑异或 | 相同为false,不同为true |
! | 逻辑非 | 取反 |
短路逻辑运算符:(效率比普通的逻辑运算符高)
符号 | 作用 | 说明 |
&& | 短路与 | 结果和&相同,但是有短路效果 |
|| | 短路或 | 结果和|相同,但是有短路效果 |
注意事项:1.&、|,无论左边true、false,右边都要执行;
2.&&、||,如果左边能确定整个表达式的结果,右边不执行;
3.&&:左边为false,右边不管是真是假,整个表达式的结果一定是false;
4.||:左边为true,右边不管是真是假,整个表达式的结果一定是true;
5.这两种情况下,右边不执行,提高了效率。
最常用的逻辑运算符:&&,||,!
三元运算符(三元表达式)
格式
关系表达式?表达式1:表达式2;
先判断关系表达式,如果为真执行表达式1,如果为假执行表达式2
计算规则
首先计算 关系表达式的值
如果值为true, 表达式1的值就是运算结果
如果值为false, 表达式2的值就是运算结果
三、运算符优先级
优先级 | 运算符 |
1 | .、()、{} |
2 | !、-、++、-- |
3 | *、/、% |
4 | +、- |
5 | <<、>>、>>> |
6 | <、<=、>、>=、instanceof |
7 | ==、!= |
8 | & |
9 | ^ |
10 | | |
11 | && |
12 | || |
13 | ?: |
14 | =、+=、-=、*=、/=、%=、&、= |
四、原码反码补码
原码
十进制数据的二进制表现形式,最左边是符号位,0为正,1为负
例如:56 --> 0 0111000;其中 0是符号位, 0111000是数据
最大值为01111111 (十进制数为+127)
最小值为11111111 (十进制数为-127)
原码的弊端:
利用原码进行计算的时候,如果是对正数进行计算是不会有问题的。
但是如果是负数计算,结果就出错,实际运算的结果,跟正确的运算方向是相反的。
反码(为了解决原码不能计算负数的问题而出现的)
正数的反码是其本身,负数的反码是符号位保持不变,其余位取反
即正数的反码不变,负数的反码在原码的基础上,符号位不变,数值取反,0变1,1变0。
反码的弊端:
负数运算的时候,如果结果不跨0,是没有任何问题的,但是如果结果跨0,跟实际结果会有1的偏差。
补码(为了解决负数计算时跨0的问题而出现的)
正数的补码是其本身,负数的补码是在其反码的基础上+1。
另外补码还能多记录一个特殊的值-128,该数据在1个字节下,没有原码和反码。
注:计算机中的存储和计算都是以补码的形式进行的。