复习:
1. 注释:在程序中用于解释说明程序的文字。单行注释 --- // 多行注释 --- /* */ 文档注释 --- /** */ --- 文档注释中的文字可以提取出来形成文档--- javadoc ---只能提取公共类
2. 字面量:指的是在计算机中不可变的值。整数常量、小数常量、字符常量、字符串常量、布尔常量、空常量
3. 进制:计数方式。二进制、八进制、十进制、十六进制 19+1=1a 99+1=9a 9f+1=a0 ff+1=100 --- 进制的转换
4. 变量:数据类型 变量名 = 数据;
5. 数据类型:
基本数据类型
byte-1字节 short-2字节 int-4字节 long-8字节 float-4字节 double-8字节 char-2 字节 boolean
byte的取值范围:-128~127
整数默认为int,小数默认为double
结尾标识:long---l float---f
char存储任意的常见字符,底层用的是utf-16编码
引用数据类型---数组、类、接口
数据的转换
自动转换
小类型转换为大类型,整数转换为小数
整数转换为小数的时候可能回产生精度损失
字符能够自动提升为整型
强制转换
大类型强转为小类型的时候会产生数据不准确
小数强转为整数的时候是舍弃小数部分
运算符
算术运算符
+ - * / % ++ -- %(取余)代表取余
byte/short/char在运算的时候会自动提升为int
int在计算完成之后结果一定是int
小类型和大类型运算的时候结果一定是大类型
整数/0 ---整数除零出现算术异常
非零小数/0 非零数字/0.0 --- Infinity
0/0.0 0.0/0 0.0/0.0 --- NaN
%的结果的符号看的%左边数字的符号
++/-- 自增或自减 在变量之前要先自增后运算;在变量之后先运算后自增
byte/short/char可以参与自增/自减运算,运算完成之后结果类型没有改变 --- 因为在底层做了一次强制转换
扩展:原反补三码
规定类型的最高位是一个符号位 --- 如果最高位为0表示正数,如果为1表示负数
任何数据在计算机中存储的都是补码,所以在计算的时候实际上也是利用补码来运算的,所以结果也是补码
正数的原反补三码一致
byte b = 127;
0111 1111 --- 原码
0111 1111 --- 反码
0111 1111 --- 补码
负数的反码是在原码的基础上,最高位不变,其余为变为原来相反数,如:0->1或1->0
负数的补码是在反码的基础上+1
byte b = -5;
1000 0101 --- 原码
1111 1010 --- 反码
1111 1011 --- 补码
规定用-0表示当前类型的最小值
1111 1111 补码 十进制为-1
赋值运算符
= += -= *= /= %= &= |= ^= <<= >>= >>>=
除了=以外,其他的符号都是相当于在这个变量本身的基础上来进行运算
int i = 10;
i /= 3; -> i=i/3 ->i=3
除了=以外,其余的符号都要求这个变量必须有值
byte/short/char都可以参与赋值运算,而且结果是原类型
注意:赋值运算的连等运算
175的二进制1010 1111,正数的源码与补码相同,然后由于补码在本题中为为负数,所以反码和源码变为负数。(这种运算首先查看补码,然后计算)
关系运算符
== 判断两个值是否相等的 != 判断两个值是否相等的 > < >= <=
运算的结果一定是逻辑值---true/false
int i = 3, j = 5;
i == j --- false
i <= j --- true
逻辑运算符
&--->与表示And |--->或Or !--->非Not ^--->亦或 &&--->短路与 ||--->短路或
针对逻辑值进行运算的。
$: true&true=true true&false=false false&true=false false&false=false
|: true|true=true true|false=true false|true=true false|false=false
!: !true=false !false=true
^: true^true=false true^false=true false^true=true false^false=false\
&&:运算规则和&一致的。如果前边的表达式的结果是false,则后边的表达式就不再运算,整个结果确定为false
||:运算规则和|一致的。如果前边的表达式的结果是true,则后边的表达式就不再计算,而整个结果确定为true
||在&&前边的时候能够把&&给短路掉(不在运算&&后面的),但是&&在||前边,不能短路掉||
位运算
注意:位运算针对的整数的补码进行计算
<< 代表左移 >> 代表右移 >>> 代表无符号右移 ~ 代表取反
& (两ture就补) | (有ture就补) ^ (同斥异吸)
(计算时将数据转换为补码)
交换值的方式
方式一:亦或法
int x =5, y = 7;
x = x ^ y; //的到x为2
y = x ^ y; -> y = x ^ y ^ y; -> y = x; -> y = 5; //x^y值为2,2^y值为5
x = x ^ y; -> x = x ^ y ^ x; -> x = y; -> x = 7; //x^y值为2,2^x值为7
方式二:加减法
int x = 3, y = 7;
x = x + y;
y = x - y; -> y = x + y - y; -> y = x; -> y = 3;
x = x - y; -> x = x + y - x; -> x = y; -> x = 7;
方式三:追尾法
int x = 3, y = 7;
int z = x;
x = y;
y = z;
扩展:考虑三种方式的优劣性
亦或法的效率最高的,但是它的使用频率最低 --- 只能适用于整数值的交换
加减法的效率低于亦或法但是高于追尾法 --- 理论上适用于数值型
追尾法的效率最低的,但是它的使用频率最高 --- 适用于所有的类型
<< 左移 >> 右移 >>>右移
(计算时将数据转换为补码)
在进行移位运算,并不是直接移动对应的位数,而是将要移动的位数对32进行取余,移动的是余数对应的位数
28 << 35 = 28 << (35 % 32) = 28 << 3 = 224 //当大于位数是取余,余数为移动的位数
100 << 32 = 100
~(取反)的计算公式:~ i= -i - 1 ;
例子:
三元运算符
逻辑值?表达式1:表达式2
执行顺序:先判断逻辑值,如果逻辑值为true,那么执行表达式1;反之执行表达式2
三元表达式依然是一个表达式,所以需要有一个计算结果,这个计算结果定义变量来进行存储
double d = a > b ? 3.5 : 5;
a > b ? 3 : true; --- 因为结果类型不兼容
double d = a > b ? ‘a’ : 2.26;
练习:
1. 定义一个整数变量,判断这个整数是一个奇数还是一个偶数
代码:int num =15;
String tr= num %2 ==1? "奇数":"偶数";
//String tr=(num&1)==1? "奇数":"偶数";
System.out.println(tr);
2. 定义一个变量表示分数,分数>=90-A >= 80-B >=70-C >=60-D <60-E
代码:int s=76;
String str=s>=90? "a":(s>=80?"b":(s>=70?"c":(s>=60?"d":"e")));
System.out.println(str);
3. 定义一个变量表示年份,判断这一年是平年还是闰年 --- 逢百年整除400,不是百年整除4
代码:int num=1200;
String str=num%4==0?"闰年":(num%400==0?"闰年":"平年");
System.out.println(str);
2000---闰年 2100--平年 2012---闰年
4.查找2的幂次方数
代码:int n=21;
String str=(n&(n-1))==0?"是":"否";
System.out.println(str);
运算符的优先级
() ~ ++ -- ! * / % + - << >> >>> 关系 逻辑 & | ^ 三元 赋值
一元运算 > 二元运算 > 三元运算 > 赋值
流程控制
顺序结构:指代码从上到下从左到右来依次编译执行
分支结构
判断结构
if(逻辑值){
代码块;
}
执行顺序:如果逻辑值为true,那么就执行代码块;反之就不执行代码块
从控制台获取数据
需要在类外写:import java.util.Scanner;
在主函数里边:
Scanner s = new Scanner(System.in);
int i = s.nextInt(); // 获取整数
double d = s.nextDouble(); // 获取小数
String str = s.nextLine(); // 获取字符串