重踏学习Java路上_Day03(java 基础上,运算符,IF等)

1:运算符(掌握)
(1)算术运算符
A:+,-,*,/,%,++,--
B:+的用法
a:加法
b:正号
c:字符串连接符
C:/和%的区别
数据做除法操作的时候,/取得是商,%取得是余数
D:++和--的用法
a:他们的作用是自增或者自减
b:使用
**(即++或--)单独使用
放在操作数据的前面和后面效果一样。
a++或者++a效果一样。
**(即++或--)参与操作使用
放在操作数的前面:先自增或者自减,再参与操作
int a = 10;
int b = ++a;
放在操作数的后面:先参与操作,再自增或者自减
int a = 10;
int b = a++;


最重要的面试题:
int x=4;
int y=(x++)+(++x)+(x*10);//每一个括号就会当作一次操作(x++)在操作后进行,所以(x++)模块输出为4,执行完(x++)后x=5,(++x)模块输出为6,此时x为6,最后加上6*10,总数为70
//y=4+6+(6*10)=70
//x=6
System.out.println(x);//6
System.out.println(y);//70


注意:整数相除只能得到整数,如果想得到小数,必须把数据化为浮点数类型
System.out.println(a*1.0/b);
System.out.println(a*1.0+b);

(2)赋值运算符
A:=,+=,-=,*=,/=,%=等
B:=叫做赋值运算符,也是最基本的赋值运算符
int x = 10; 把10赋值给int类型的变量x。
C:扩展的赋值运算符的特点
隐含了自动强制转换。

拓展的赋值运算符:+=,-=,*=,/=,%=

+=把左边和右边做加法,然后赋值给左边


面试题:
short s = 1;
s = s + 1;

short s = 1;
s += 1;
请问上面的代码哪个有问题?

第一个会出现问题,原因是两个short进行运算会默认转换为int后在运算,赋值给short类型会出现截取现象,精度损失,出现爆索

而第二个没有问题的原因是,拓展的赋值运算符其实隐含了一个强类型的转换,

short s = 1; s += 1;(其实不是等价于s=s+1,而是等价于s = (s的数据类型))(s+1);所以不会报错。 


(3)比较运算符
A:==,!=,>,>=,<,<=
B:无论运算符两端简单还是复杂最终结果是boolean类型。
C:千万不要把==写成了=

D.==:基本类型:比较的就是值是否相同;引用类型:比较的就是地址值是否相同
(4)逻辑运算符
A:&,|,^,!,&&,||
B:逻辑运算符用于连接boolean类型的式子
C:结论
&:有false则false
|:有true则true
^:相同则false,不同则true。
举例:情侣关系 男男false 男女true 女男true 女女false
!:非true则false,非false则true

&&:结果和&是一样的,只不过有短路效果。左边是false,右边不执行。
||:结果和|是一样的,只不过有短路效果。左边是true,右边不执行。

因为具有短路功能,所以我们一般开发中选用:&&,||,! 三个逻辑运算符


(5)位运算符(了解)

注意:要做位运算,首先要把数据转换为二进制,而且要变为补码再做运算

左移符号会把数据*2的移动次幂  2<<3  = 16

右移符号会把数据/2的移动次幂   12>>1 =6     12>>2=3

无符号右移:-24>>2 = -24/4=6

                -24>>>2 = 1073741818  (原因是右移后左边补的是0,而此时移动的值为补码,补码符号位为0时,原码,补码,反码都相同,所以不用改变,最后变为1073741818)


A:^的特殊用法(^为异或位运算)
一个数据针对另一个数据位异或两次,该数不变
B:面试题
a:请实现两个变量的交换
**采用第三方变量
**用位异或运算符
左边a,b,a
右边a^b

方法二:

int a = 3;

int b = 4;

a=a^b;

b=a^b;(此时b=(a^b)^b=a,交换了a出来)

a=a^b;(此时a=(a^b)^a=b,交换了b出来)

此时a与b已经交换完毕

方法三:

a=a+b;

b=a-b;

a=a-b;//这样也能交换

方法四:

b=(a+b)-(a=b);//就能交换a与b的值


b:请用最有效率的方式计算出2乘以8的结果
2<<3   ----2*2^3=8(所有的乘法都会转移到位移上运算)

表达式:就是用运算符把常量或者变量连接起来的符合java语法的式子

(6)三元运算符,三目运算符
A:格式
比较表达式?表达式1:表达式2;
B:执行流程:
首先计算比较表达式的值,看是true还是false。
如果是true,表达式1就是结果。
如果是false,表达式2就是结果。
C:案例:
a:比较两个数据是否相等 //a==b
b:获取两个数据中的最大值//a>b?a:b
c:获取三个数据中的最大值//

方法一:int temp =(a>b)?a:b;temp = (temp>c)?temp:c;

方法二:int max = (a>b)?(a>c?a:c):(b>c?b:c);


2:键盘录入(掌握)
(1)实际开发中,数据是变化的,为了提高程序的灵活性,我们加入键盘录入数据。
(2)如何实现呢?目前就记住
A:导包
import java.util.Scanner;

Java 5添加了java.util.Scanner类,这是一个用于扫描输入文本的新的实用程序。

位置:在class的上边
B:创建对象
Scanner sc = new Scanner(System.in);
C:获取数据
int x = sc.nextInt();
(3)把三元运算符的案例加入键盘录入改进。

3:流程控制语句
(1)顺序结构 从上往下,依次执行
(2)选择结构 按照不同的选择,执行不同的代码

     选择结构有特定的语法规则,代码要执行具体的逻辑运算进行判断,逻辑运算的结果有两个,所以产生了选择,按照不同的选择执行不同的代码。Java语言提供了两种选择结构语句:if语句与switch语句。

(3)循环结构 做一些重复的代码

4:if语句(掌握)
(1)三种格式
A:格式1
if(比较表达式,关系表达式) {
语句体;
}
注意事项:关系表达式无论是简单还是复杂,结果必须是boolean类型;if语句控制的语句体如果是一条语句,大括号可以省略;如果是多条语句,就不能省略。建议永远不要省略。

一般来说:有左大括号就没有分号,有分号就没有左大括号,例子:

int b = 100;

if(b!=100); {

     System.out.println("啦啦啦");

}//因为if后面有一个分号,已经结束了,大括号此处变成了一个语句块,单独执行,做一输出"啦啦啦"

结果输出:啦啦啦()


执行流程:
判断比较表达式的值,看是true还是false
如果是true,就执行语句体
如果是false,就不执行语句体

B:格式2
if(比较表达式) {
语句体1;
}else {
语句体2;
}

执行流程:
判断比较表达式的值,看是true还是false
如果是true,就执行语句体1
如果是false,就执行语句体2

C:格式3
if(比较表达式1) {
语句体1;
}else if(比较表达式2){
语句体2;
}
...
else {
语句体n+1;
}

执行流程:
判断比较表达式1的值,看是true还是false
如果是true,就执行语句体1
如果是false,就继续判断比较表达式2的值,看是true还是false
如果是true,就执行语句体2
如果是false,就继续判断比较表达式3的值,看是true还是false
...
如果都不满足,就执行语句体n+1
(2)注意事项
A:比较表达式无论简单还是复杂,结果是boolean类型
B:if语句控制的语句体如果是一条语句,是可以省略大括号的;如果是多条,不能省略。
建议:永远不要省略。
C:一般来说,有左大括号,就没有分号,有分号,就没有左大括号。
D:else后面如果没有if,是不会出现比较表达式的。
E:三种if语句其实都是一个语句,只要有一个执行,其他的就不再执行。
(3)案例:
A:比较两个数是否相等
B:获取两个数中的最大值
C:获取三个数中的最大值(if语句的嵌套)
D:根据成绩输出对应的等级
E:根据月份,输出对应的季节
F:根据x计算对应y的值并输出
(4)三元运算符和if语句第二种格式的关系
所有的三元运算符能够实现的,if语句的第二种格式都能实现。
反之不成立。if..else..比较数值大小和三元比较大小。

如果if语句第二种格式控制的语句体是输出语句,就不可以。
因为三元运算符是一个运算符,必须要有一个结果返回,不能是一个输出语句。

12:看程序写结果:请自己独立分析,先不要编译运行。
第一题
int x = 1,y = 1;

if(x++==2 & ++y==2) //f&t =f x=2 y=2
{
x =7;
}
System.out.println("x="+x+",y="+y);

---------------------------------------------------
第二题
int x = 1,y = 1;

if(x++==2 && ++y==2)//x=2 y =1 因为第一个为false所以不执行,短路
{
x =7;
}
System.out.println("x="+x+",y="+y);

---------------------------------------------------
第三题
int x = 1,y = 1;

if(x++==1 | ++y==1)// 2 2
{
x =7;
}
System.out.println("x="+x+",y="+y);//7 2

---------------------------------------------------
第四题
int x = 1,y = 1;

if(x++==1 || ++y==1)因为第一个为true所以不执行,短路
{
x =7;
}
System.out.println("x="+x+",y="+y);//7 1

---------------------------------------------------

原文地址:https://www.cnblogs.com/canceler/p/4575416.html