运算符

介绍

运算符是一种特殊的符号,表示数据间的一些操作

  • 算术运算符
  • 赋值运算符
  • 关系运算符【比较运算符】
  • 逻辑运算符
  • 位运算符【二进制基础】
  • 三元运算符

算术运算符

运算符 运算
+ 正号
- 负号
+
-
*
/
% 取余
++ 自增(前)先运算后取值
自增(后)先取值后运算
- - 自减(前)先运算后取值
自减(后)先取值后运算
+ 字符串相加

除法(/)

Java在进行除法运算的时候,一定要关注数据的类型,相同的数据,不同的数据类型可能会得出来不同的结果。这一点其实在C++中也存在。下面是一个关于除法运算的一个案例(仅供参考):

1
2
3
4
5
6
7
8
9
10
11
// ArithmeticOperator.java
// 创建一个公共的类,切记一个.java文件只能有一个公有库,且名字与文件名一致
public class ArithmeticOperator{
// 创建main函数,至于为什么是这个,笔者现在还不知道,笔者也在学习
public static void main(String[] args){
System.out.println(10 / 4); // 2;因为数据的类型都是int,输出也应该是int
System.out.println(10.0 / 4); // 2.5;由于10.0是double,则在运算的时候,数据结果在运算的过程中转换为了double类型
double d = 10 / 4;
System.out.println(d); // 2.0;在运算过程中右边的数据并没有转变数据类型,所以右边的结果应该是int类型,但是现在要赋值给double类型的变量,所以右边的int类型被转换成了double
}
}

取模(取余,%)

其实取模的运算可以看作一个公式,即 a % b = a - a / b * b

下面是一些案例,仅供参考:

1
2
3
4
5
6
7
8
9
// ArithmeticOperator.java
// 创建一个公共的类,切记一个.java文件只能有一个公有库,且名字与文件名一致
public class ArithmeticOperator{
public static void main(String[] args){
System.out.println(10 % 3); // 1
System.out.println(-10 % 3); // -1
System.out.println(10 % -3); // 1
}
}

其实在上面的案例中我们可以先不看两个数字的符号。

按绝对值,即正数来运算,最后得出来的余数与%前面的数字的符号一致。

自增(++)

自减与自增基本一致,这里笔者就只写自增啦,自减的话希望大家可以举一反三进行程序编写和测试。

1
2
3
4
5
6
7
8
9
10
11
12
13
// ArithmeticOperator.java
// 创建一个公共的类,切记一个.java文件只能有一个公有库,且名字与文件名一致
public class ArithmeticOperator{
public static void main(String[] args){
int i = 1;
int k = i++;
System.out.println(k); // 1; ++在后面就是先把i拿来用,再给i增加一个数值。
System.out.println(i); // 2
int m = ++i;
System.out.println(i); // 3
System.out.println(m); // 3;++在前面就是先给i增加一个数值,再拿i来用。
}
}

如果是变量单独运算,即不与其它变量进行混合运算时,前后无所谓。

小题两道

1
2
3
int i = 1;
i = i++; //会使用一个临时变量:(1)temp=i;(2)i=i+1;(3)i=temp
i = ? // 1
1
2
3
int i = 1;
i = ++i;//使用一个临时变量(1)i=i+1;(2)temp=i;(3)i=temp
i = ? // 2

编程:定义一个变量来保存华氏温度,华氏温度转换成摄氏温度的公式为: 5/9*(华氏温度-100),请求出华氏温度对应的摄氏温度。[123.4]

步骤:分析需求;给出思路;写代码。

关系运算符

  • 结果都是布尔型,即只有true和false两种。
运算符 运算
== 相等于
!= 不等于
< 小于
> 大于
<= 小于等于
>= 大于等于
instanceof 检查是否是类的对象

比较运算符的==不要写成=,=是赋值运算符。

关系运算符理解各个运算符的实际意义即可。

逻辑运算符

  • 短路与&&, 短路或||, 取反!
  • 逻辑与&, 逻辑或|,逻辑异或^
a b a&&b a||b a&b a|b !a a^b
true true true true true true false false
true false false true false true false true
false true false true false true false true
false false false false false false true false

对比上表理解每个运算符的运算规则。

image-20240710173904650

其他的运算符可以按照上面的

对于短路与&&, 当第一个条件是false,后面的条件就不会再执行,有and的意思。

1
2
3
4
5
6
7
8
9
10
11
public class LogicOperator{
public static void main(String[] args){
int a = 5;
int b = 9;
if(a < 1 && ++b < 50){
System.out.println("Over!");
}
System.out.println(b);
// 9;没有运行++b的操作,可以清晰地知道当判断了a<1为false后,判断语句就不再向后执行,这是短路与&&te'you。
}
}

短路或||和短路与&&类似,当第一个条件是true之后,后面的条件不再判断,有or的意思。

==注意:==短路与和短路或,当第一个条件就可以确定整个式子的值时,就不再看第二个式子;逻辑与和逻辑或,所有条件必须全部都要检查后才能给出整个式子的答案

赋值运算符

  • 赋值运算符 =
    • 从右向左运算
    • 符号左边必须是变量,右边可以是变量、表达式、常量值
  • 复合赋值运算符
    • +=
    • -=
    • *=
    • ^=
    • %=
    • 复合运算符在进行运算的时候会进行类型转换

三元运算符

条件表达式?表达式1:表达式2;

  • 如果条件表达式是true,则进入表达式1
  • 如果条件表达式是false,则进入表达式2

表达式返回的值必须是接收变量所能接收的类型,举例:

1
2
3
4
int a = 1;
int b = 2;
int c = a > b ? 1.1 : 3.2; //报错,因为接收变量c是int类型,而1.1与3.2默认是double类型,int类型不兼容double类型,所以会报错
int d = a > b ? (int)1.1 : (int) 3.2; //3; 这里使用的是强转,因此右边成为了int类型,可以被左边接收

位运算

进制

满基数就向高位进1

  • 二进制(0b):0,1;基数是2
  • 十进制:0-9;基数是10
  • 八进制(0):0-7;基数是8
  • 十六进制(0x):0-F;基数是16
1
2
3
4
int n1 = 0b1010; //10
int n2 = 1010; //1010
int n3 = 01010; //520
int n4 = 0x1010; //65793

码制

最高位是符号位,且java中没有无符号数,即java中的数都有符号位,0表示正数,1表示负数

  • 原码:按照二进制规则来写就行
  • 反码:正数时与原码一致;负数时,原码符号不变,其他的按位取反
  • 补码:正数时与原码一致;负数时,反码基础上加1

计算机中的运算,都是以补码形式进行运算;但是计算结果看的是原码。

运算

运算符:&、|、^、~

1
2
3
4
5
6
7
8
9
10
2&3;// 2
//2的补码 00000000 00000000 00000000 000000010
//3的补码 00000000 00000000 00000000 000000011
//按位与 00000000 00000000 00000000 000000010
// 运算后的结果是补码,转换为原码,因为是正数,所以一致。
~2; //-3
//2的补码 00000000 00000000 00000000 000000010
//按位取反11111111 11111111 11111111 11111101 这个时候答案是补码,需要转换为原码才能输出
//答案反码11111111 11111111 11111111 11111100
//答案原码10000000 00000000 00000000 000000011

运算符:>>、<<、>>>

1
2
3
4
>>算术右移,低位溢出,符号位不变,并用符号位补溢出的高位;本质是/2
<<算术左移,符号位不变,低位补0;本质是*2
>>>逻辑右移,低位溢出,高位补0
没有<<<符号

标识符的规则和规范

规则

规则就是必须遵守的,不应该违背的。

==变量命名:==不能包含关键字(public、int、double等)和保留字(goto等),并且不能用数字开头;变量名只能由数字,字母和符号(_与$)组合来命名

规范

为了看起来更加专业和方便[没有必须要求]

  • 包名:多单词组成时所有字母用小写,如aaa.bbb.ccc
  • 类名、接口名:多单词组成时,所有单词首字母大写(大驼峰),如LogicOperator
  • 变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写(小驼峰),如logicOperator
  • 常量名:所有字母均大写,如MAXN

键盘输入

介绍

在进行程序的开发时,我们经常需要与用户进行交互,接收用户的数据输入等。java接收这些信息就需要创建一个扫描器(对象),Scanner

步骤

  • 导入该类的所在包
  • 创建该类对象(声明变量)
  • 调用里面的功能

举例说明:从键盘输入一些信息,让java接收

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import java.util.Scanner;  // 把java.util下的Scanner类导入程序 
// Scanner是简单的文本扫描器

public class input{

// 编写一个main方法
public static void main(String[] args){
// 进行键盘的输入
// new 就是创建一个对象,猜测是构造函数
Scanner scan = new Scanner(System.in); //scan只是一个变量名,可在规定的基础上进行随意的更改
//用户输入并进行接受
System.out.print("请输入数据"); //abcd
String data = scan.next(); //接收用户的输入
System.out.println(data);

int num = Scan.nextInt(); //接收int类型的数据
System.out.paintln(num);
}
}

大家也可以试试其他的输入类型,不过不同的类型接收方式也不同哈。

作业

将String转换为double类型,将char转换为String类型

1
2
3
4
5
String s = "123.4";
double d = Double.parseDouble(s);

char c = 'C';
String s1 = c + "";

判断正误

1
2
3
byte b = 19; short s = b + 2; //error;2是int类型,所以右边是int,int不能给short
double d = 1.1F; //可以
int i = 2; char c = i + 1; //error;int类型不能装入char