文章目录
一、运算符
运算符:对字面量或者变量进行操作的符号
表达式:用运算符把字面量或者变量连接起来,符合Java语法的式子
不同运算符连接的表达式体现的是不同类型的表达式
1.算术运算符
+和-和*:在代码中,如果有小数参与计算,结果有可能不精确。
/:整数参与计算,结果只能得到整数;
小数参与计算,结果有可能不精确
+
数字相加
数字进行运算时,数据类型不一样不能运算,需要转成一样的,才能运算。
隐式转换(自动类型提升)
将取值范围小的数值转换为取值范围大的数值(不需要额外写代码实现,程序自动转化)
byte<short<int<long<float<double
public class Demo1{
public static void main(String[] args){
int a = 10;
double b = 12.3;
数据类型?c = a + b;//double
}
}
byte、short、char三种类型的数据在运算的时候,都会直接先提升为int,然后再进行运算
public class Demo2{
public static void main(String[] args){
byte a = 10;
byte b = 20;
数据类型?c = a + b;//int
}
}
强制转换
将取值范围大的数值转换为取值范围小的数值
如果把一个取值范围大的数值,赋值给取值范围小的变量,是不允许直接赋值的。如果一定要这么做就需要加入强制转换。
格式:目标数据类型 变量名 = (目标数据类型)被强转的数据
public class Demo3{
public static void main(String[] args){
double a = 12.3;
int b = (int)a;
}
}
强制转换可能导致数据发生错误
public class Demo4{
public static void main(String[] args){
int a = 300;
byte b = (byte)a;
}
}
字符串相加
当“+”操作中出现字符串时,这个“+”是字符串连接符,而不是算术运算符了。会将前后的数据进行拼接,并产生一个新的字符串。
public class Demo5{
public static void main(String[] args){
System.out.println("123" + 123);//"123123"
}
}
“123”+123->“123123”
连续进行“+”操作时,从左到右逐个执行。
public class Demo6{
public static void main(String[] args){
System.out.println(1 + 99 + "年黑马");//"100年黑马"
}
}
字符相加
当字符+字符或字符+数字时,会把字符通过ASCII码表查询到对应的数字再进行计算。
public class Demo7{
public static void main(String[] args){
System.out.println(1 + 'a');//98
}
}
public class Demo8{
public static void main(String[] args){
System.out.println('a' + "abc");//"aabc"
}
}
-
*
/和%(取模、取余)
区别:两个数据做除法,/取结果的商,%取结果的余数。
整数操作只能得到整数,要想得到小数,必须有浮点数参与运算。
%只能整数参与计算。
数值拆分
键盘录入一个三位数,将其拆分为个位、十位、百位后,打印在控制台
公式总结:
个位:数值%10
十位:数值/10%10
百位:数值/100%10
千位:数值/1000%10
…
import java.util.Scanner;
public class Arithmetic{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
System.out.println("Please write a three-digit number");
int n = sc.nextInt();
int a,b,c;
a=n%10;
b=n/10%10;
c=n/100%10;
System.out.println("The units digit is:"+a);
System.out.println("The tens digit is:"+b);
System.out.println("The hundreds digit is:"+c);
}
}
2.自增自减运算符
++ 自增运算符
– 自减运算符
++和–既可以放在变量的前边,也可以放在变量的后边。
(1)单独使用
++和–无论是放在变量的前边还是后边,单独写一行结果是一样的。
(2)参与计算
public class Demo9{
public static void main(String[] args){
int a = 10;
int b = a++;//先++->先用后加:a=11,b=10
}
}
public class Demo10{
public static void main(String[] args){
int a = 10;
int b = ++a;//后++->先加后用:a=11,b=11
}
}
3.赋值运算符
=
+=
将左边和右边进行相加,然后再把结果赋值给左边。
细节:底层都隐藏了一个强制类型转换
public class Demo11{
public static void main(String[] args){
short s = 1;
s += 1;//等同于s = (short) (s+1);
}
}
-=
*=
/=
%=
4.关系运算符(比较运算符)
关系运算符的结果都是boolean类型,要么为true,要么为false。
千万不要把“==”误写成“=”。
两个符号中间没有空格。
==
!=
>
>=
<
<=
约会
您和您的约会对象在餐厅里面正在约会。
键盘录入两个整数,表示你和你约会对象衣服的时髦度。(手动录入0~10之间的整数,不能录其他)
如果你的时髦程度大于你对象的时髦程度,相亲就成功,输出true。
否则,输出false。
import java.util.Scanner;
public class CompareOperate{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
System.out.println("Please enter the fashion level of your clothes(0~10)");
int myFashion = sc.nextInt();
System.out.println("Please enter the fashion level of your date's clothes(0~10)");
int dateFashion = sc.nextInt();
System.out.println(myFashion > dateFashion);
}
}
5.逻辑运算符
最常用的逻辑运算符:&&、||、!
&逻辑与(且)
并且,两边都为真,结果才是真
|逻辑或
或者,两边都为假,结果才是假
^逻辑异或
相同为false,不同为true
!逻辑非(取反)
取反的感叹号不要写多次,要么不写,要么写一次。
短路逻辑运算符
当左边的表达式能确定最终的结果,那么右边就不会参与运行了。
提高程序运行效率。
&&短路与(而且)
结果和&相同,但是有短路效果
判断用户名 && 判断密码
当用户名正确会判断密码
当用户名错误不会判断密码,直接false
public class LogicOperate1{
public static void main(String[] args){
int a = 10;
int b = 10;
boolean result = ++a<5 && ++b<5;
System.out.println(result);//false
System.out.println(a);//11
System.out.println(b);//10
}
}
public class LogicOperate2{
public static void main(String[] args){
int a = 10;
int b = 10;
boolean result = ++a<5 & ++b<5;
System.out.println(result);//false
System.out.println(a);//11
System.out.println(b);//11
}
}
||短路或(或者)
结果和|相同,但是有短路效果
如果没房需要再看车
如果有房无需再看车,直接穿走小棉袄
Ctrl+D向下复制一行
数字6
数字6是一个真正伟大的数字,键盘录入两个整数。
如果其中一个为6,最终结果输出true。
如果它们的和为6的倍数,最终结果输出true。
其他情况都是false。
import java.util.Scanner;
public class LogicOperate3{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
System.out.println("Please enter the first integer");
int number1 = sc.nextInt();
System.out.println("Please enter the second integer");
int number2 = sc.nextInt();
boolean result;
if(number1 == 6 || number2 == 6 || (number1 + number2 ) % 6 == 0)
result = true;
else
result = false;
System.out.println(result);
}
}
6.三元运算符(三元表达式)
格式:
关系表达式?表达式1:表达式2;
关系表达式为真,表达式1的结果为整个三元表达式的结果;
否则,表达式2的结果为整个三元表达式的结果。
三元表达式的结果必须要被使用:赋值或者打印。
求两个数的较大值:
int max = a > b ? a : b;
System.out.println(a > b ? a : b);
两只老虎
动物园里有两只老虎,体重分别为键盘录入获得,请用程序实现判断两只老虎的体重是否相同。
import java.util.Scanner;
public class TwoTigers1{//不用三元表达式
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
System.out.println("Please enter the weight of the first tiger");
double firstTigerWeight = sc.nextDouble();
System.out.println("Please enter the weight of the second tiger");
double secondTigerWeight = sc.nextDouble();
System.out.println("Does the two tigers have the same weight?");
System.out.println(firstTigerWeight == secondTigerWeight);
}
}
或用三元表达式
import java.util.Scanner;
public class TwoTigers2{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
System.out.println("Please enter the weight of the first tiger");
double firstTigerWeight = sc.nextDouble();
System.out.println("Please enter the weight of the second tiger");
double secondTigerWeight = sc.nextDouble();
System.out.println(firstTigerWeight == secondTigerWeight ? "same" : "not same");
}
}
和尚的最高身高
一座寺庙里住着三个和尚,已知他们的身高分别为150cm、210cm、165cm,请用程序实现获取着三个和尚的最高身高。
public class BonzesMaxHeight{
public static void main(String[] args){
int firstHeight = 150,secondHeight = 210,thirdHeight = 165;
int maxHeight = firstHeight > secondHeight ? firstHeight : secondHeight;
maxHeight = maxHeight > thirdHeight ? maxHeight : thirdHeight;
System.out.println(maxHeight+"cm");
}
}
Ctrl+Alt+L:自动格式化代码(自动对齐)
7.运算符优先级
()优先于所有
二、原码、反码、补码
1.原码
十进制数据的二进制表现形式,最左边是符号位,0位正,1为负。
利用原码对正数进行计算是不会有问题的。
但是如果是负数计算,结果就出错,实际运算的结果,跟我们预期的结果是相反的。
一个0或1为1bit,一个比特位
一个字节有八个比特位:-127~127
2.反码
为了解决原码不能计算负数的问题而出现的。
计算规则:正数的反码不变;负数的反码在原码的基础上,符号位不变,数值位取反,0变1,1变0。
反码的弊端
在反码中,0有两种表现形式:0000 0000和1111 1111
跨0会有一个1的误差。
3.补码
为了解决负数计算时跨0的问题而出现的。
正数的补码不变;负数补码=反码+1。
数字的存储和运算都是以补码的形式进行的。
补码:1000 0000 为-128,没有原码和反码
一个字节:-128~127
隐式转换
前面补0
强制转换
去掉前面不要的
其他运算符
& 逻辑与
计算数字,没有短路
0为false,1为true
|逻辑或
计算数字,没有短路
0为false,1为true
<< 左移
向左移动,低位补0
a<<1,左移一次,乘2;左移两次,乘4。
>右移
向右移动,高位补0或1:
如果原来是负数,补1;原来是整数,补0。
右移一次,除2;右移两次,除四。
>>>无符号右移
向右移动,高位补0