Java学习第四天~第六天之运算符
(韩顺平103/910)——后面的总结我一般就不听了,因为我自己做了总结~
ps:周末真的很容易摆烂~居然学了三天吗QWQ
运算符介绍:
运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等。
- 算数运算符;
- 关系运算符(比较运算符);
- 逻辑运算符;
- 位运算符(需要二进制基础);
- 三元运算符;
算数运算符:
对数值类型的变量进行运算的,再Java程序中使用的很多。
加减乘除,取模(取余);自增++(前,后两种);自减(前,后两种);拼接(+,有一个为字符串类型的时候执行)。
细节:
- +,-,*,/,%,++,–,重点在%,++,–上;
/**
*演示算数运算符的使用
*/
public class ArithmeticOperator{
public static void main(String[] args){
// +,-,*,/,%,++,--
System.out.println(10/4);// 从数学看是2.5,但由于是整数类型,所以会去除小数点即后面的部分
System.out.println(10.0/4);// 现在是2.5,所以要是要保留小数点,一定要有一个是浮点数的类型。
double d = 10 / 4;// 由于设定了d是double类型
// 所以虽然后面都是int类型,算出来的值先去除了小数点和后面的数字为2;
// 但要将int赋值给double类型的变量,所以变为了2.0(这和C与Python很不一样)
System.out.println(d);
// 取摸的本质: a % b = a- (int)a/b*b(注意这里是整除)。
// Java中,取模运算可以用于浮点数。
System.out.println(10 % 3); //1
System.out.println(-10 % 3); //-1
System.out.println(10 % -3); // 1
System.out.println(-10 % -3); // -1
// ++的使用:
// 作为独立语句使用,前后无区别;
int i = 10;
i++; // 等价于 i = i + 1
++i; // 等价于 i = i + 1
System.out.println("i=" + i);
/*
作为表达式使用,是有区别的:
前——先增后赋值;
后——先赋值,再增加。
*/
int j = 8;
int k = j++;
System.out.println(k);
System.out.println(j);
k = ++j;
System.out.println(k);
System.out.println(j);
}
}
赋值运算符:
赋值运算符就是将某个运算后的值,赋给指定的变量。
分类:
基本赋值运算符=:
int a = 10;
这就是最基本的赋值运算符。
复合运算符:
+=、-=、*=、/=、%=。
a += b;就是 a = a+b。
赋值运算符的特点:
- 运算符顺序从右往左(int num = a + b + c;体现为先计算为a + b + c再将其赋值为num。)
- 赋值运算符的左边,只能是变量,右边可以是变量、表达式、常量值;
- 复合赋值运算符的运算如何进行(分类已经提及,不再赘述);
- 复合赋值运算会进行类型的强制转换。
- byte b = b + 2;
- 等价于 byte b = (byte)(b+2);
++运算也是含有类型的强制转换的。
逻辑运算符:
逻辑运算符用于连接多个条件(关系表达式),最终的结果也是一个boolean值。
有短路效应的运算符:
&&短路与:
表达式1 && 表达式2
- 当且仅当两个表达式的值都为true是,才为真,否则为假;
- 当表达式1为假,不再运行表达式2;
- 效率高,编程常用。
短路或||:
表达式1 || 表达式2
- 当一个表达式的结果为true,结果就为true,否则为false;
- 当表达式1为true,不再运行表达式2;
- 效率高,编程常用。
无短路效应的运算符:
&无短路效应的与:
与&&类似,只是没有短路效应,所以运算效率低,编程不常用。
|无短路效应的或:
与||类似,只是没有短路效应,所以运算效率低,编程不常用。
!逻辑非运算:
取反操作,原本真变假,假变真。
^逻辑异或操作:
当两个操作数的结果都相同时,为fales,否则为真。
关系运算符:
关系运算符的结果都是boolean型,要么是true,要么是false;
关系表达式经常用与if结构的条件中或循环结构的条件中。
关系运算符类型:
- ==:判断是否相等;
- <=:判断是否小于等于;
- **>=:**判断是否大于等于;
- >:判断是否大于;
- <:判断是否小于;
- !=:判断是否不等于;
- instanceof——检查是否是类的对象。
位运算符:
进制:
对于整数,有四种表示方法:
- 二进制——0,1;满二进一,以0b或0B开头;
- 十进制——0-9;满十进一;
- 八进制——0-7;满八进一,以数字0开头;
- 十六进制——0-9,A-F,满16进1,以0x或0X开头表示。
public class BinaryTest{
public static void main(String[] args){
int n1 = 0b100;
int n2 = 0100;
int n3 = 100;
int n4 = 0x100;
System.out.println("二进制:" + n1);
System.out.println("八进制:" + n2);
System.out.println("十进制:" + n3);
System.out.println("十六进制:" + n4);
}
}
进制转换:
其它进制转十进制:
从最低位(默认最右边)开始,将每个位上的数提取出来,乘以基数的位数-1次方,然后求和
十进制转其它进制:
除基取余法,直到结果为0,然后将余数倒过来,就是其它进制。
转换为二进制的时候,要注意,不满8位要补0,因为一个字节有8位。
二进制转八、十六进制:
- 转八进制,从右开始,每三位一组,转为相应的八进制数即可;(不足三位的在高位补0)
- 转十六进制,从右开始,每四位一组,转为相应的十六进制即可;(不足四位的在高位补0)
八进制、十六进制转二进制:
- 从右开始,每位八进制数转换为三位二进制数;
- 从右开始,每位十六进制数转换为四位二进制数。
原码,补码,反码(要背):
对于有符号的而言:
- 二进制的最高位是符号位:0表示正数,1表示负数;
- 正数的原码、补码和反码都是一样的;
- 负数的反码=原码的符号位不变,其它位按位取反;
- 负数的补码=反码+1;
- 0的反码,补码都是0;
- java没有无符号数;
- 在计算机运行时,都是以补码的方式来运算的;(用补码就将正数和负数相整合了)
- 当我们看运算结果的时候,要看他的原码(重要)。
位运算:
java中有7个位运算符:
- 按位与 &:两位全为1,相应的位上结果为1,否则为0;
- 按位或 |:只要一位为1,相应的位上结果为1,否则为0;
- 按位异或 ^:两位不一样,结果为1,否则为0;
- 按位取反 ~:0变1,1变0;
- 算数右移 >>:低位溢出,符号位不变,并用符号位补溢出的高位;
- 算数左移 <<:符号位变,低位补0;
- 逻辑右移 >>>:无符号右移,低位溢出,高位补0;
- 没有 <<< 符号。
// 位运算:
public class BitOperator{
public static void main(String[] args){
// 在计算机中的运算都是靠补码
// 1.先得到2的补码——00000000 00000000 00000000 00000010;
// 2.再得到3的补码——00000000 00000000 00000000 00000011;
// 3.按位与——00000000 00000000 00000000 00000010——是补码;
// 4.输出要将其转换为原码形式再输出,由于正数三码合一,就是上文的值,输出转为十进制。
System.out.println(2&3);
// 1.-2的补码:
// 先得到-2的原码: 10000000 00000000 00000000 00000010;
// 再得到-2的反码: 11111111 11111111 11111111 11111101;
// 最后得到-2的补码: 11111111 11111111 11111111 11111110;
// 2.按位取反: 00000000 00000000 00000000 00000001;
// 3.输出要将其转换为原码形式再输出,由于正数三码合一,就是上文的值,输出转为10进制。
System.out.println(~-2);
// 1.2的补码: 00000000 00000000 00000000 00000010;
// 2.按位取反: 11111111 11111111 11111111 11111101;
// 3.输出先换原码,先为反码: 11111111 11111111 11111111 11111100;
// 再为原码: 10000000 00000000 00000000 00000011;(-3)
System.out.println(~2);
// 1、1的补码—— 00000000 00000000 00000000 00000001;
// 2、右移两位——00000000 00000000 00000000 00000000;低位溢出,高位补符号位
// 3、本质是1/2/2.
int a = 1 >> 2;
// 1、1的补码—— 00000000 00000000 00000000 00000001;
// 2、左移两位——00000000 00000000 00000000 00000100;符号位不变,低位补0;
// 3、本质是1*2*2
int b = 1 << 2;
// 1、1的补码—— 11111111 11111111 11111111 11111111;
// 2、无符号右移,高位补0,低位溢出:00111111 11111111 11111111 11111111
int c = -1 >>> 2;
System.out.println(a);
System.out.println(b);
System.out.println(c);
}
}
三元运算符:
基本语法:
条件表达式 ? 表达式1:表达式2;
运算规则:
- 若条件表达式的结果为true,返回的结果为表达式1的值;
- 若条件表达式的结果为假,返回的结果为表达式2的值。
- 真1假2
使用细节:
- 表达式1和表达式2要为可以赋值给接受变量的类型(或可以自动转换);
- 三元运算符可以转换为if–else语句
练习:如何使用三元运算符求取三个数里最大的值?
/**
* 三元运算符演示:
*/
public class TernaryOperator{
public static void main(String[] args){
int a = 10;
int b = 99;
int result = a>b ? a++ : b--;
System.out.println(result);
// 思路:
// 1、先求出两个数的最大值;
// 2、再和第三个值进行比较。
int n1 = 10;
int n2 = 12;
int n3 = 99;
int max1 = n1>=n2?n1:n2;
int result1 = max1>=n3?max1:n3;
System.out.println(result1);
// 使用一条语句:
// 推荐分步实现,一步实现看着太乱了。
int max = (n1>=n2?n1:n2)>=n3?(n1>=n2?n1:n2):n3;
System.out.println("max="+max);
}
}
运算符的优先级:
- 运算符有不同的优先级,所谓的优先级就是表达式运算中的运算顺序;(从上到下依次降低)
- 只有单目运算符(针对一个数的操作运算符)、赋值运算符是从左到右运算的。
. () {} ; , | |
---|---|
R -> L | ++ – ~ !(data type) |
L -> R | * / % |
L -> R | + - |
L -> R | << >> >>> 位移 |
L -> R | < > <= >= instanceof |
L -> R | == != |
L -> R | & |
L -> R | ^ |
L -> R | | |
L -> R | && |
L -> R | || |
L -> R | ? : |
R -> L | = *= /= %= |
+= -= <<= >>= | |
>>>= &= ^= |= |
小结:
不用刻意去背,使用多了就熟悉了;
- () , {}等
- 单目运算;
- 算数运算符;
- 位移运算符;
- 关系(比较)运算符;
- 逻辑运算符(非短路的优先级高,与比或的优先级高)
- 三元运算符;
- 赋值运算符。
标识符的命名规则和规范:
规则——必须遵守;
规范——遵守更好。
标识符的概念:
- Java对各种变量、方法和类命名时的字符序列就是标识符;
- 凡是自己可以取名的地方都叫标识符。
命名规则:
- 由26个英文字母(大小写),0-9数字或_$组成;
- 数字不可以开头;
- 不可以使用关键字或者保留字,但能包含关键字或保留字;
- 严格区分大小写,长度大小无限制;
- 标识符不能包含空格。
命名规范[这样做更专业]:
- 包名:多单词组成时所有字母都小写:aaa.bbb.ccc;
- 类名、接口名:多单词组成时,所有单词的首字母要大写:AaaBbbCcc【大驼峰命名方式】;
- 变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写:xxxYyyZzz【小驼峰法,简称驼峰法】;
- 常量名:所有的字母都大写,多单词之间用下划线间隔:XXX_YYY_ZZZ;
- 以后会有文档,更加详细的就看里面了。(一般只用英文,很少用拼音)。
键盘输入语句:
在编程的过程中,我们需要接收用户的输入,就可以使用键盘输入语句来获取Input.java,需要一个扫描器(对象),就是Scanner:
- 导入该类所在的包,java.util.*;
- 创建该类对象(声明变量);
- 调用里面的功能。
/**
* 要求:可以从控制台接受用户信息
* [姓名,年龄,薪水]。
*/
// Scanner表示一个简单的文本扫描器
import java.util.Scanner;//表示将java.util下的Scanner类导入
public class Input{
public static void main(String[] args){
// 创建 Scanner 对象,new 创建一个对象
Scanner myScanner = new Scanner(System.in);
System.out.println("请输入名字:");
// 接收用户输入,使用相关方法
String name = myScanner.next();// 用于接受用户输入字符串
// 当程序执行到了next方法时,会等待用户输入~~~
System.out.println("请输入年龄:");
int age = myScanner.nextInt();// 用于接受用户输入int
System.out.println("请输入薪水:");
double salary = myScanner.nextDouble();// 用于输入接受double
System.out.println("人的信息如下:");
System.out.println("名字=" + name + " 年龄=" + age + " 薪水:" + salary);
}
}