3-1,比较运算符&逻辑运算符
1,比较运算符:>,<,==,!=,>=,<=
如果用==比较两个引用类型变量,比价的是内存地址。
比较运算符运算完的结果必须是true或false。
2,逻辑运算符
&(AND与)、|(OR或)、^(XOR异或)、!(NOT非)、&&(AND短路与)、||(OR短路或)
逻辑运算符用于连接两个boolean类型的表达式。
例如:
int x = 3;
system.out.println(x>2 & x<5);
打印结果时true,如果x=6,则结果时false。
另外的比较运算:instanceof,检查是否是类的对象。
例如:”Hello” instanceof String 是true。
3,异或:^
true ^ true = false
true ^ false = true
false ^ true = true
false ^ false = false
异或的运算规律:^符号的两边结果如果相同,结果是false,两边的结果不同,结果是true。
4,!!true = true
5,&&和&的区别:
&&和&运算结果时一样的,但是运算过程有点小区别。
&:无论左边的运算结果是什么,右边都参与运算;
&&:当左边为false时,右边不参与运算。
||和|的区别:
||和|运算结果时一样的,但是运算过程有点小区别。
|:无论左边的运算结果是什么,右边都参与运算。
||:当左边为true时,右边不参与运算。
3-3,位运算符
1,二进制位的运算:
<<(左移)、>>(右移)、>>>(无符号右移)、&(与运算)、|(或运算)、^(异或运算)、~(反码)。
2,十进制数的位运算是先将一个十进制数转换为二进制,再对二进制位进行位运算,再将得到的二进制转换为十进制。
例如:&运算,计算6&3
6的二进制是110,3的二进制是011.
所以:(1表示true,0表示false)
110
&011
010
再将010转换为十进制,所以6&3=2。
|、^、~与&类似。
3,&运算的小规律。
两个数进行&运算,取两串二进制数中第一个’1’在较低位的那串,然后只取两串中1后面的位数运算即可,因为两边只要有一个为0,其结果就为0,不是二进制中的有效数字。
例如:
11010111
&00010001
第二串的第一个1在较低位,所以两串中的数只计算这一位后面的即可,因为前面的三个0与任何数做&运算,都是0,0不是有效位。
4,规律:6^3=5
110
^011
101
^011
110
即:6^3^3=6
规律:一个数异或同一个数两次,结果还是这个数。
此规律可以用于加密。例如:将一个图片的底层二进制码异或3,此时这张图片已经不能看,若将这张图片的底层二进制码再异或3,这张图片又能正常使用。
5,~反码:二进制取反,即0变为1,1变为0。
3-4,位移运算符
1,<<
左移几位其实就是该数乘以2的几次方。
3<<2=12, = 3*22
<<可以完成2的次幂运算。
<<图示:
2,右移:补位时,最高位是什么就用什么补。
右移几位其实就是该数据除以2的几次方。
3,>>>:无符号右移。数据进行右移时,高位出现的空位,无论原高位是什么,空位都用0补。
4,位运算练习:
对两个整数变量的值进行交换。//(1)有第三方变量:
int a = 3 , b = 5;
int c;
c = a ;
a = b;
b = c;
sop(“a=”+a+”,b=”+b);
//a=5,b=3
//(2)无第三方变量
int a = 3 , b = 5;
a = a + b;
b = a – b;
a = a – b;
sop(“a=”+a+”,b=”+b);
//a=5,b=3
//这种方式不要用,如果两个整数的数值过大,会超出int范围,会强制转换,数据会变化。
(3)无第三方变量
//位运算法,一个数异或同一个数两次,结果还是这个数。
int a = 3 , b = 5;
a = a ^ b; //a = 3 ^ 5
b = a ^ b; //b = (3 ^ 5) ^ 5; b = 3
a = a ^ b; //a = (3 ^ 5) ^ 3; a = 5
sop(“a=”+a+”,b=”+b);
//a=5,b=3
//一般都用第一种方式,因为阅读性强。
3-5,三元运算符
格式: (条件表达式)?表达式1:表达式2;
如果条件表达式结果为true,则返回表达式1的结果,否则返回表达式2的结果。
int x=0,y;
y = (x > 1)?100:200;
sop(y);
结果:y=200;
例:获得三个整数中较大的整数。
int o,p,q;
itn temp = o>p?o:p;
int max = temp>q?temp:q;
sop(“max=”+max);
3-6,语句——if格式
int a=3,b;
if(a>1)
b=100;
else
b=200;
sop(“b=”+b);
虽然b没有被初始化,但if语句都要执行,可以输出b的结果。
b = a>1?100:200; //三元运算符就是if else语句的简写形式。
b = a>1?sop(100):sop(200); //这个式子中,b没有赋值,三元运算符是运算符,必须有一个运算结果,而if else语句可以没有运算结果。
简写格式什么时候用?
当if-else运算后,有一个具体的结果时,可以简化写成三元运算符。
2,if-else
if-->else if-->else if-->else是一条语句,从上到下执行,if(x>1)匹配,则执行它后面的语句,后面的else if-->else if-->else都不执行。
3,if(false);
{sop(“Helloworld!!”);}
这种情况编译不报错,if后有分号时,if语句的执行体为空,结束了if语句,后面的输出语句与if语句没有一点关系,打印出Hello world!!若if后无分号,则sop为执行体,条件为false,不执行执行体,不打印Hello world!!。
3-7,局部代码块
1,在一个函数中用一对{}表示这对大括号之间的部分是局部代码块。
用处:用于定义局部变量的生命周期。
此时编译报错,m的定义在局部代码块中,局部代码块结束后,m被自动释放,故sop(“over..”+ m)中的m将无法找到。M的作用域仅在局部代码块中。主函数中的变量全部是局部变量。
2,局部代码块可以定义局部变量的声明周期。如果一个变量仅在一个区间内有作用,那么可以将该区间用{}括起来,当该区间结束时,变量被自动释放,有利于程序的优化。
3-8,语句-switch
1,只有4中数据类型供switch选择:byte,short,int,char。
2,无论default的位置在哪,都先读第一个case语句。
3,最后一个case中的break可以不写,switch语句执行到大括号结束。
4,若default在开头或中间,且其中没有break,则:若case都不匹配,执行default,执行default后会继续执行后面的case语句,不再对case进行判断,直接执行case中的代码。
3-9,switch-练习。
int month = 3;
switch(month){
case 3:
case 4:
case 5:
sop(month+"月对应的是春季");
break;
case 6:
case 7:
case 8:
sop(month+"月对应的是夏季");
break;
case 9:
case 10:
case 11:
sop(month+"月对应的是秋季");
break;
case 12:
case 1:
case 2:
sop(month+"月对应的是冬季");
break;
default:
sop(month+"月没有对应的季节");
}
这样写swtich-case语句,提高了复用性,提高程序的效率,简洁易读。
3-9,if语句和switch语句的区别。
1,if和switch的应用。
if:
(1)对具体的值进行判断。
(2)对取件判断。
(3)对运算结果是boolean类型的表达式进行判断。
switch:
(1)对具体的值进行判断。
(2)值得个数通常是固定的。
对于几个固定的值得判断,建议使用switch语句,因为switch语句会将具体的答案都加载进内存,效率相对高一点。
后期对switch又加入了枚举和字符串两种判断类型。
3-10,while练习-计数器思想:
打印1-100内6的倍数出现的次数。
int x = 1;
int count = 0;
while(x<=100) {
if(x%6==0) //可以被6整除
count++;
x++; //增量x+1,不加1会出现死循环。
}
sop("count=" +count );
3-11,for语句。
for语句格式:
for(初始化表达式;循环条件表达式;循环后的操作表达式)
{执行语句;(循环体)}
例1:
int x = 1;
for(sop("a");sop("b");sop("c")){
sop("d");
x++;
}
这个例子编译失败,因为中间的条件表达式运算结果必须是boolean型。初始化表达式有多个时,用逗号分开。
例2:
int x = 1;
for(sop("a");x<3;sop("c")){
sop("d");
x++;
}
编译通过,打印a d c d c。
for语句的执行:初始化表达式只读一次,判断循环条件,为true就执行循环体,然后在执行循环后的操作表达式,接着继续判断循环条件,重复这个过程,知道调节为false为止。
3-12,for和while的区别。
1,for和while的特点。
(1)for和while可以互换。
(2)格式上的不同,在使用上有点小区别。
如果需要通过变量来对循环进行控制,该变量只作为循环增量存在时,区别就体现出来了。
例如:打印1-10十个数字。
int x = 1;
while(d<5){
sop("x=" + x);
x++;
}
sop("x==="+x);
打印:
x=1
x=2
x=3
x=4
x===5
---------------------------------------
for(int y=1;y<5;y++) {
sop("y=" + y);
}
sop("y==="+y);
打印:
y=1
y=2
y=3
y=4
最后一句报错,因为y是在for循环内定义的,是for的局部变量,for结束后自动释放y,所以后面的y找不到变量。
2,无限循环的最简单形式。
while(true){}
for(;;){} //中间的条件表达式默认是true。
无限循环存在的原因是:并不知道循环多少次,而是根据某些条件来控制循环,当满足某些条件的时候,跳出循环(break)。
3-13,循环结构的使用场景。
当对某些代码执行很多次时,使用循环结构完成。
当对一个条件进行一次判断时,可以使用if语句。
当对一个条件进行多次判断时,可以使用while语句。
注意:
在使用循环时,一定要明确哪些语句需要参与循环,哪些不需要。
循环通常情况下,需要定义条件,需要控制次数。