算术运算符
符号 | 名称 | 例子 | 结果 |
---|---|---|---|
% | 取模 | 11%5 | 1 |
/ | 除 | 6/2 | 3 |
除法(/)
System.out.println(10 / 4);
//输出2,因为10和4都是int型数据,结果为int型
System.out.println(10.0 / 4);
//输出2.5,因为10.0是double型,故结果为double型
double d = 10 / 4;
System.out.println(d);
//输出2.0,因为10/4计算得int型结果2,然后将2转换为double型得2.0
取模(%)
a % b
当a是负数时。底层的运算为:a - (int)(a/b) * b
-10.5%3 => -10.5-(-10)/3*3
= -10.5 - (-3)*3
= -1.5
PS: 有小数参与运算时,得到的是近似值
输出结果:
- 练习
int i = 1;
i = i++; //(1)temp = i (2)i = i+1 (3)i = temp
System.out.println(i); //i = 1
int i = 1;
i = ++i; //(1)i = i+1 (2)temp = i (3)i = temp
printf("%d",i); //i=2
return 0;
//定义一个变量保存华氏温度,华氏温度转换为摄氏温度的公式为:5/9*(华氏温度-100)
//算出华氏温度对应的摄氏温度
double a = 234.5;
double b = 5.0 / 9 * (a - 100);
//double b = 5 * (a-100) / 9;
//注意是5.0不是5 因为int型的精度比较低,导致最后的结果为零
System.out.println("对应的温度为" + b);
关系运算符
运算符 | 运算 | 例子 | 结果 |
---|---|---|---|
instanceof | 检查是否是类的对象 | “Ihh” instanceof String | true |
&& 和 & 使用区别(||和|)
-
&&短路与:如果第一个条件为false,则第二个条件不会判断,最终结果为false。
-
&逻辑与:不管第一个条件是否为false,第二个条件都要判断,效率低。
在开发当中,一般都是用短路与&&,效率高。
同样,一般用短路或||。
逻辑非(!)和逻辑异或(^)
boolean x = true;
boolean y = false;
short z = 46;
if((z++ == 46) && (y = true)) z++; //注意 y = true 是赋值,为true ,z = 48
if((x = false)||(++z == 49)) z++; //注意 x = false 是赋值,为true ,z =50
System.out.println("z=" + z); //结果z= 50
boolean m = x ^ y; //false 异或 true = true
System.out.println(m);
赋值运算符
byte b = 3;
b += 2; //正确,等价于b = (byte)(b + 2);
b = b + 2; //错误,右边结果是int型
b++; //等价于b = (byte)(b + 1);
三元运算符
条件表达式 ? 表达式1:表达式2;
- 求三个数的最大值
int a = 10;
int b = 20;
int c = 30;
//方法一
int temp = a > b ? a : b;
int lagest = temp > c ? temp : c;
System.out.println("a,b,c当中最数的是" + lagest);
//方法二
int lagest = (a > b ? a : b) > c ? (a > b ? a : b) : c;
System.out.println("a,b,c当中最数的是" + lagest);
运算符优先级
(1)() {}等
(2)单目运算符 + + - -
(3)算术运算符 + - * / %
(4)位移运算符 >> <<
(5)比较运算符 < > <= == !=
(6)逻辑运算符 && ||
(7)三元运算符 ? :
(8)赋值运算符 =
标识符命名规范
(1)包名:多单词组成时所有字母都小写:aaa.bbb.ccc
(2)类名、接口名:多单词组成时,所有单词的首字母大写:XxxYyyZzz[大驼峰]
(3)变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写:xxxYyyZzz[小驼峰,简称 驼峰法]
(4)常量名:所有字母都大写。多单词时,每个单词都用下划线链接:XXX_YYY_ZZZ
键盘输入(Scanner)
(1)导入该类的所在包,java.util.*(*在此为Scanner)。
import java.util.Scanner
//表示把java.util包里的Scanner类导入进来
(2)创建该类对象实例(声明变量)。
Scanner myScanner = new Scanner(System.in);
//创建Scanner对象,名字为myScanner,new 创建一个对象
//myScanner就是Scanner类的对象
(3)调用里面的方法。接收用户的输入。
Scanner myScanner = new Scanner(System.in);
//用户输入
System.out.println("请输入名字:");
String name = myScanner.next(); //接收用户输入的字符串
System.out.println("请输入年龄:");
int age = myScanner.nextInt(); //接收用户输入的整型数据
System.out.println("请输入工资:");
double salary = myScanner.nextDouble(); //接收用户输入的浮点数
System.out.println("name:" + name + "age:" + age + "salary:" + salary);
进制表示
-
二进制:0,1,以0b或0B开头。
-
十进制:0-9。
-
八进制:0-7,以数字0开头表示。
-
十六进制:0-9及A(10)-F(15),以0x或者0X开头表示,其中A-F不区分大小写。
进制转换
m进制 -> 十进制
规则:从最低位(右边)开始,每一位的数提取出来,乘以m的(位数-1)次方。然后求和。
0b1101 = 1*2^0 + 1*2^2 + 1*2^3
0234 = 4*8^0 + 3*8^1 +2*8^2
0x23A = 10*16^0 + 3*16^1 + 2*16^2
十进制 -> m进制
规则:将该数不断除以m,直到商为0,然后将每步得到的余数倒过来,就是对应的二进制。
34 = 0B00100010(前面有两个0是因为要至少凑一个字节)
237 = 0xED
二进制 -> 八进制
规则:从低位开始,将二进制数每三位一组,转成对应的八进制
其余进制:先转换为二进制,再转换为八进制
八进制 -> 二进制
规则:每个八进制位转为三位二进制数
二进制 -> 十六进制
规则:从低位开始,将二进制数每四位为一组,转成对应的十六进制
其余进制:先转为二进制,再转为十六进制
十六进制 -> 二进制
规则:每个八进制位转为四位二进制数
位运算
java当中有7个位运算(&、|、^、~、>>、<<和>>>)
分别是按位与&、按位或|、按位异或^、按位取反~,算术右移>>,算术左移<<,逻辑右移(无符号右移)>>>,它们的运算规则:
按位:每一位都要进行对应运算
(1)按位异或^:不同为1,相同为0
(2)按位取反~:0变1,1变0
(3)算术右移>>:低位溢出,符号位不变,并用符号位补溢出的(缺失的)高位
- 右移多少位,即除以多少个2
(4)算术左移<<:符号位不变,低位补0
- 左移多少位,即乘以多少个2
(5)逻辑右移(无符号右移)>>>:低位溢出,高位补0(注意:没有<<<符号)
原码、反码、补码
1) 二进制的最高位十符号位:0表示正数,1表示负数。
2) 正数的原码、反码,补码都一样。
3) 负数的反码 = 它的原码符号位不变,其它位取反。
4) 负数的补码 = 它的反码 + 1,负数的反码 = 负数的补码 - 1。
5) 负数的补码 = 原码右数第一个1,其左边(除符号位)全部取反,右边不变。
6) 0的反码,补码都是0。
7) java没有无符号数,换言之,java中的数都是有符号的。
8) 在计算机运算的时候,都是以补码的方式来运算的。
9) 当我们看运算结果时候,要看他的原码。