运算符介绍
-
运算符介绍
运算符是一种特殊的符号,用以表示数据的运算 赋值 和比较等
- 算术运算符
- 位移运算符
- 比较运算符
- 逻辑运算符
- 三元运算符
- 赋值运算符
算术运算符
public class ArithmeticOperator {
//演示算术运算符的使用
public static void main(String[] args) {
// / 使用 除法
System.out.println(10 / 4);//从数学来看是2.5 但计算机是2
// java 中结果是int 会把0.5去掉
System.out.println(10.0 / 4);//double 2.5
double d = 10 / 4;//java中 10 / 4 = 2 ,2-->2.0
System.out.println(d);//2.0
// % 取模(取余)使用
// 在Java中 取模的本质 看一个公式 a % b = a - a / b * b
// -10 % 3 => -10 -(-10)/ 3 * 3==> -10+9 = -1
// 10 % 3 => 10 - (10) / -3 * -3 ==> 10-9= 1
// -10 % -3 => -10 -(-10) / -3 * -3 ==> -10 + 9 =-1
System.out.println(10 % 3); // 1
System.out.println(-10 % 3); // -1
System.out.println(10 % -3); // 1
System.out.println(-10 % -3); // -1
// a % b 当 a 是小数时 公式 = a -(int)a /b *b
// -10.5 % 3 = -10.5 -(-10)/3*3 = -10.5 -9 = -1.5
System.out.println(-10.5 % -3); // -1
// ++ 自增使用
//如果独立使用i++、++i完全一样的 等价于 i = i + 1;
int i = 10;
i++; // 自增 等价于 i = i + 1;
++i;//自增 等价于 i = i +1;
System.out.println("i= " + i);//12
/*
作为表达式来使用
前 ++ : ++i 先自增后赋值
后 ++ : i++ 先赋值后自增
*/
int j = 8;
//int k = ++j; // 等价 j = j+1 ;k=j;
int k = j++; //等价于 k=j; j=j+1;
System.out.println("k=" + k + "j=" + j);//k=8 , j=9;
}
}
- 案例
public class ArithmeticOperatorExercise03 {
public static void main(String[] args) {
//需求:
//假设还有59天放假,问"合" + j + "个星期零" + k + "天"
//2.思路
// 使用 int 变量 days 保存 天数
// 一个星期是 7 天 days / 7 星期数 零多少天 days % 7
//输出
int days = 59;
int weeks = days / 7 ;
int leftDays = days % 7;
System.out.println("合" + weeks + "个星期零" + leftDays + "天");
double huaShi = 234.6;
double sheShi = 5.0 / 9 * (huaShi - 100);
System.out.println("华氏温度为" + huaShi + "对应的摄氏温度"+ sheShi);
}
}
关系运算符
public class RelationalOperator {
public static void main(String[] args) {
//演示关系运算符的使用
int a = 9;
int b = 8;
System.out.println(a > b);//T
System.out.println(a >= b);//T
System.out.println(a <= b);//F
System.out.println(a < b);//F
System.out.println(a == b);//F
System.out.println(a != b);//T
boolean flag = a > b;
System.out.println("flag=" + flag);
//细节
// 关系运算符的结果都是boolean型 要么是true 要么是false
}
}
逻辑运算符
public class LogicOperator {
public static void main(String[] args) {
//演示逻辑运算符的使用
//&& 和 & 的案例演示
int age = 50;
if (age > 20 && age < 90) {
System.out.println("ok100");
}
//& 使用
int age1 = 50;
if (age1 > 20 & age1 < 90) {
System.out.println("ok100");
}
//区别
int a = 4;
int b = 9;
//对于短路与而言,第一个条件为false,后面的条件不会执行
if (a < 1 && ++b < 50){
System.out.println("ok300");
}
System.out.println("a=" + a + "b=" + b);
//对于逻辑与而言,第一个条件为false,后面的条件仍然执行
if (a < 1 & ++b < 50){
System.out.println("ok400");
}
System.out.println(a +" "+ b);
//短路与 && 更高效
//逻辑与 & 会判断两遍,
//开发中,一般使用短路与 &&
}
}
public class LogicOperator01 {
public static void main(String[] args) {
//演示 || 和 | 的使用
//短路或 || 如果第一个条件为true ,就不会执行后面的判断
int age = 50;
if (age > 20 || age < 30) {
System.out.println("ok100");
}
// 逻辑或 | 如果第一个条件为true ,也会执行后面的判断
// | 使用
int age1 = 50;
if (age1 > 20 | age1 < 30) {
System.out.println("ok200");
}
//开发中一般使用 短路或 || 效率高
int a = 4;
int b =9;
if(a > 1 || ++b > 4){
System.out.println("ok300");
}
System.out.println(a + " " + b);
if (a > 1 | ++b > 4){
System.out.println("ok400");
}
System.out.println(a + " " + b);
}
}
public class InverseOperator {
public static void main(String[] args) {
// ! 就是非操作 T->F ; F -> T
System.out.println(60 > 20);//T
System.out.println(!(60 > 20));//F
// a ^ b: 叫逻辑异或 ,当 a 和 b 不同时 则结果为True ,否则为False
boolean b = (10 > 1) ^(3 > 5);
System.out.println("b=" + b); // F
}
}
赋值运算符
public class AssignOperator {
public static void main(String[] args) {
//演示赋值运算符的使用
int n1 = 10;
n1 +=4; //等价于 n1 = n1 +4
System.out.println(n1);//14
n1 /=3 ; // n1 = n1 / 3;
System.out.println(n1);//4
//复合赋值运算符会进行类型强制转换 byte
byte b = 3;
b += 2; // 等价于 b = (byte)(b +2);
b++; // b = (byte)(b + 1);
System.out.println(b);
}
}
三元运算符
-
基本语法
条件表达式 ? 表达式1 :表达式2
-
运算规则
- 条件表达式为true, 结果为表达式1
- 条件表达式为false, 结果为表达式2
public class TernaryOperator {
public static void main(String[] args) {
//演示三元运算符的用法
int a = 4;
int b = 9;
// 解读
// a > b 为 false
// 返回 b--,
// 先返回b 的值 再 返回 b -1;
// 返回 9 的结果
int result = a > b ? a++:b--; // 9
System.out.println(result); // 9
System.out.println(a);//4
System.out.println(b);//8
//三元运算符细节
//表达式1 和表达式2要为可以赋给接收变量的类型(或可以自动转换)
int x = 3;
int y = 8;
int res = a > b ? a : b ;
// int res1 = a > b ? 1.1 : 2.1; //错误的
double res2 = a > b ? a : b +3; //自动转换 int -->double
//三元运算符可以转成if-else语句
if(x>y) {
a++;
}else {
b--;
}
}
运算符的优先级
- . () ,{}
- 单目运算 – ++
- 算术运算符
- 位移运算符
- 比较运算符
- 逻辑运算符
- 三元运算符
- 赋值运算符
标识符的命名规则和规范
-
标识符概念
- java 对各种变量、方法和类的命名时使用的字符序列称之为标识符
- 凡是自己取名的地方都叫标识符
-
标识符的命名规则**[必须遵守]**
- 由26个英文字母 和0-9,_或$组成
- 数字不能开头 int 3ab =1;//错误
- 不可以使用关键字和保留字,但能包含关键字和保留字
- java严格区分大小写,长度不限
- 标识符不能包含空格。int a b = 90;
-
标识符命名规范**[更专业]**
- 包名:多单词组成时所有的字母都小写:aaa.bbb.ccc
- 类名、接口名:多单词组成时,所有单词的首字母大写:XyyYyyZzz[大驼峰]
- 变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始首字母大写:xxxYyyZzz[小驼峰]
- 常量名:所有的单词都大写。多单词每个单词用下划线连接:、XXX_YYY_ZZZ
- 命名规范要时刻遵守,更详细看文档
关键字
键盘输入语句
-
介绍
在编程中,需要接收用户输入的数据,就可以使用键盘输入语句来获取。
input.java ,需要一个扫描器对象 就是Sacnner
-
步骤
- 导入该类的所在包,java,util.*
- 创建该类对象(声明变量)
- 调用里面的功能
import java.util.Scanner;//表示把java.util下的Scanner类导入 public class Input { public static void main(String[] args) { //演示接收用户的输入 //步骤 //1.引入Scanner类的包 //2.创建Scanner 对象 Scanner myScanner = new Scanner(System.in); //3.接受用户的输入:使用相关的方法 System.out.println("请输入名字"); //当程序执行到next 方法时 会等待用户输入~~~~~ String name = myScanner.next(); //接收用户的输入 System.out.println("请输入年龄"); int age = myScanner.nextInt(); //接收用户的输入 System.out.println("请输入薪水"); double sal = myScanner.nextDouble(); //接收用户的输入 System.out.println("人的信息如下:"); System.out.println("名字=" + name + "年龄=" + age + "薪水=" + sal); } }
进制
- 进制介绍
- 二进制:0、1,满2进1 以0b或0B开头
- 八进制:0-7 ,满8进1 以数字0开头表示
- 十进制:0-9 ,满10进1
- 十六进制:0-9及A(10)-F(15),满16进1 以0x或0X开头
进制的转换
-
其他进制转十进制
-
二转十
- 规则从最低位开始,将每个位上的数提取出来,乘以2的(位数-1)次方
0b1011=1x20+1x21+0x22+1x23=1+2+0+8=11
-
八转十
- 规则从最低位开始,将每个位上的数提取出来,乘以8的(位数-1)次方
0234=4x80+3x81+2x8^2+=4+24+128=156
-
十六转十
- 规则从最低位开始,将每个位上的数提取出来,乘以16的(位数-1)次方
0x23A = 10x160+3x161+2x16^2=10+48+512=570
-
-
十进制转其他进制
-
十转二
- 规则:将该数不断除以二,直到商为零为止,然后将每步得到的余数倒过来,就得到对应的二进制了。
34 = 0b00100010
-
十转八
- 规则:将该数不断除以八,直到商为零为止,然后将每步得到的余数倒过来,就得到对应的八进制了
34=042
131=0203
-
十转十六
- 规则:将该数不断除以十六,直到商为零为止,然后将每步得到的余数倒过来,就得到对应的十六进制了
34=0x22
237=0xED
-
-
二进制转其他进制
-
二进制转八进制
- 规则:从低位开始,将二进制数的每三位一组,转成对应的八进制数即可
0b11010101=0325
-
二级制转十六进制
- 规则:从低位开始,将二进制数的每四位一组,转成对应的十六进制数即可 1111 —> F
0b11010101=0xD5
-
-
其他进制转二进制
-
八进制转二进制
- 规则:将八进制数每一位,转成对应的一个3位的二进制数即可
0237 = 0b10011111
-
十六进制转二进制
- 规则:将十六进制数每一位,转成对应的一个4位的二进制数即可
0x23b=0b001000111011
-
位运算
- 二进制是逢2进1的进制位,0、1是基本算术。
- 现代的电子计算机技术全部采用的是二进制,因为它只使用0,1两个数字符号,非常简单方便,易于用电子方式实现。计算机内部处理的信息,都是采用二进制数来表示。二进制数用0和1两个数字及其组合来表示任何数。进位规则逢2进1,数字1在不同的位上代表不同的值,按从右至左的次序,这个值以二倍递增
原码 补码 反码(重点 难点)
- 二进制的最高位是符号位:0表示正数 1表示负数 (0 -> 0, 1 -> -)
- 正数的原码 反码 补码 都一样
- 负数的反码 = 它的原码符号位不变 其他位按位取反(0->1 1->0)
- 负数的补码 = 它的反码 + 1 , 负数的反码 = 负数的补码 - 1
- 0的反码 补码都是0
- java没有无符号数 换言之 java的数都是有符号的
- 在计算机运算的1时候,都是以补码的方式进行运算的
- 当我们看运算结果的时候 要看它的原码
位运算详解
- 位运算符
- java中有7个运算符(&,|,^,~,>>,<<和>>>)
- 分别是按位与,按位或、按位异或,按位取反
- 按位与 全1为1,反之为0
- 按位或 全0为0 ,反之为1
- 按位异或 不同为1,相同为0
- 按位取反 0->1 1->0
- 比如 2&3 =2 ~-2 =
public class BitOperator {
public static void main(String[] args) {
//演示位运算
//先得到2的补码 =》 2 的原码 00000000 00000000 00000000
//00000010
//正数的原码、反码、补码一样
//得到3的补码
//按位与&
// 结果 0000000 00000000 00000000 00000010
System.out.println(2&3);//2
//推导
//1 先得到 -2 的原码 1000000 00000000 00000000 00000010
// 2 -2的反码 11111111 11111111 11111111 11111101
// 3 -2的补码 11111111 11111111 11111111 11111110
//4 ~-2的操作 00000000 00000000 00000000 00000001 运算后的补码
//5 运算后的原码 就是 00000000 00000000 00000000 00000001 +1
System.out.println(~-2);//1
//1 先得到 2 的补码 00000000 00000000 00000000 00000010
//~2的操作 11111111 11111111 11111111 11111101 运算后的补码
//3 -1 得到反码 11111111 11111111 11111111 11111100 反码
//4 按位取反 得到原码 10000000 00000000 00000000 00000011 -3
System.out.println(~2);//-3
System.out.println(2|3);//3
System.out.println(2^3);//1
}
}
-
还有3个位运算符 >> 、<< 和 >>> 运算规则
-
算术右移 >> :低位溢出 符号位不变 并且用符号位补溢出的高位
-
算术左移<< 符号位不变 ,低位补0;
-
、>>> 逻辑右移 也叫无符号右移 运算规则 低位溢出(扔掉) 高位补零
-
特别说明 没有<<< 符号
-
public class BitwiseTest {
//位运算思考题
public static void main(String[] args) {
int a =1>>2;//1向右位移2位 00000000 00000000 00000000 00000001
int b =-1>>2;// 10000000 00000000 00000000 00000001
//11111111 11111111 11111111 11111110 +1
//11111111 11111111 11111111 11111111 -1
//11111111 11111111 11111111 11111110
//10000000 00000000 00000000 00000001 -1
int c =1<<2;//算术左移
int d =-1<<2;
// 10000000 00000000 00000000 00000001 原码
// 11111111 11111111 11111111 11111110 取反
// 11111111 11111111 11111111 11111111 +1 补码
// 11111111 11111111 11111111 11111100 -1 运算后的补码
// 11111111 11111111 11111111 11111011 反码
// 10000000 00000000 00000000 00000100 -4
int e =3>>>2; //无符号右移
int f =~2;
System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println(d);
System.out.println(e);
System.out.println(f);
}
}