Java基础第二篇--------算术运算符,表达式,语句
一、运算符
1.1 加减运算符: + , - ;
乘,除和取余运算符:*, / , %
自增,自减运算符: ++,--;
算术混合运算的精度:
精度从“低”到“高”的排序是:
Byte short int long float double
注意:Java按照运算符两边操作元的最高精度保留结果的精度
1.2关系运算符,赋值运算符
运算符 | 优先级 | 用法(表达式) | 含义 | 结合方向 |
> | 6 | op1 > op2 | 大于 | 左到右 |
赋值运算符:=,不再是数学含义的”等于号“了。
赋值表达式: <变量> = <常量 | 变量 >
1.3位运算符(在进行逻辑判断的时候,条件是否满足的时候经常用到,加密与解密)
1 “按位与”运算符“&”,规则:全1则1,否则为0
2. “按位或”运算符“|”,规则:全0则0,否则为1
3. “按位非”运算符“~”,规则:遇1则0,遇0则1
4. “按位异或”运算符“^”,规则:相同为0,不同为1
1.4逻辑运算符,短路或
运算符 | 优先级 | 用法 | 含义 | 结合方向 |
&& | 11 | op1&&op2 | 短路与 | 左到右 |
Java中&& 与 & ,|与||的区别,
&& 是逻辑运算中的”短路与”,若”&&”的前面条件为false时,判断结果为false,不再执行”&&”后面的判断,”&&”前为true则继续进行后面的判断。
&是两边的条件都要满足才能是true.
||是逻辑运算中的”短路或”,如果||的所有条件都为false的时候,整个语句结果才是false,否则只要有一个为true,整个语句结果就为true.
短路与举例:
Int x = 1;
设置逻辑运算
((y=1)==0) && ((x=6)==6)
X的值仍然是1
设置逻辑运算
((y=1)==1) && ((x=6)==6)
X的值变为6
下面附上一个实例
package cn.com.basicOne;
public class ORand {
public static void main(String[] args) {
int a = 0, b = 2, c = 4,d = 5,k = 2, r = 4;
boolean x = (a==1) || (b==2); //短路或,结果为true
System.out.println(" x = "+ x);
boolean y = (a==1) | (b==2); //逻辑或,结果为true
System.out.println(" y = "+y);
boolean m = (a==1) && (b==2); //短路与,结果为false
System.out.println(" m = "+m);
boolean n = (a==1) & (b==2); //逻辑与,结果为false
System.out.println(" n = "+n);
//也可以一起使用
boolean h = (a==b) || (b==c) && (c == d); //混合结果为false ,太明显了。
System.out.println(" h = "+h);
boolean i = (b == k) || (b == c) || (c==d); //混合结果为true,因为有一个为真
System.out.println(" i = "+i);
boolean g = (b == k) && ((b == c) || (c == r));
System.out.println(" g = "+g); //请读者判断
}
}
逻辑运算符的逻辑运算
Op1 | Op2 | Op1&&op2 | Op1||op2 | !Op1 |
true | true | true | true | false |
true | false | false | true | false |
false | true | false | true | true |
false | false | false | false | true |
逻辑运算符与位运算符的区别:
1.逻辑运算符只能针对boolean类型进行逻辑运算,而位运算还
可以对数值进行逻辑运算。
2.逻辑运算符有短路情况,即前面的表达式可以得到最终结果时,
后面的表达式将不被执行。
在初级阶段经常会遇到将十进制转换为二进制的情况,笔者在做ACM上遇到过几题。
在此说一下关于二进制的基础
二进制转成十进制,就是按照每位的是1还是0进行判断,计算机中可以用0,1表示所有的数,而可以用2的幂的和表示所有的数,有个顺序
2^0 = 1 ,2^1=2,2^2=4.........也就是说所有的数可以用1,2,4,8,16.。。。。这些数的一部分的和来表示。
举个例子
10010111 从右向左看,第一位表示2^0 ,也就是说二进制代码中0,1的位置就是2的指数减一,所以第一位为1,第二位为2,第三位为7,第四位为0,不写,依次类推可以得到下面的表格将第二行相加就是十进制数了。
1 | 0 | 0 | 1 | 0 | 1 | 1 | 1 |
128 | 0 | 0 | 16 | 0 | 4 | 2 | 1 |
通常小数点在右边因此可以进行如下表述:
二进制转十进制采用幂加和方式,从小数点左侧第一位为0次幂,小数点左侧第二位为1次幂,以此类推。当查看的位数为1时,则计算,当查看的位数为0时,则不计算。
补码是计算机用于规范计算的一种二进制表示方式,计算机使用数值的第一位来表示数据的正负。由于有符号位的限制,原码表示法不能正确的表述0,因此有一种补码表示法可以解决+0不等于-0的情况。
先介绍一下反码,反码是二进制源码逐位取反的结果。不过符号位不变。
补码的计算公式(分正数和负数):
1.正数:源码、反码和补码都相同。
2.负数:补码 = 反码(符号位保持不变) + 1
注意:负数在计算补码的时候,在源码取反的过程中要保留符
号位不变,其他位取反。
例如:10001010取反11110101(第一个1不变)
移位运算符:
移位运算符有三种:
1.>> 右移运算符:将二进制数据进行右移运算。
2.<< 左移运算符:将二进制数据进行左移运算。
3.>>> 无符号右移运算符:无论正负,都在高位插入0。
示例如下:
public class Yiwei {
public static void main(String[] args) {
System.out.println(8<<2); //左移两位,尾部加两个0, 即1000----->10 0000
System.out.println(16>>2); //右移两位,尾部去掉两个0,即1 0000----->100
System.out.println(16>>>3); //无符号位右移,在高位补0 即 1 0000---->0001 0,低位的三个0 舍弃
}
}
三目运算符:是一个逻辑判断与赋值运算符的组合。
语法如下:<逻辑表达式> ? <表达式1> : <表达式2>
说明:当逻辑表达式为真时,表达式1有效;当逻辑表达式为假时,表达式2有效。
这里面还有点说道:
1. 当表达式1和表达式2具有相同的类型时,表达式结果就是这个类型。
2.当表达式1和表达式2是不同的类型时,表达式结果就是类型范围比较大的那个。
下面给个实例:
public class SanMu {
public static void main(String[] args) {
int a = 2 > 3 ? 2: 3;
System.out.println("a = "+a );
//int b = 3.4 > 2.2 ? 2 : 2.3; 因为表达式1和表达式2 的类型不同因此向类型更高的类型转换
double b = 3.4 > 2.2 ? 2 : 2.3;
System.out.println("b = "+b);
int c = 'c' > 'b' ? 2: 3;
System.out.println("c = "+c);
int d = 'm' > c ? 'c': '3'; //char类型比较小,因此结果值应该转换为int类型
System.out.println("d = "+d);
//这一段代码不会被编译通过,因为表达式1和表达式2的类型不匹配,
//解决办法有两种1是将表达式的值强制转换成String类型,2是将x的类型改为Object类型
//String x = 1 > 2 ? new Object() : new String("sd");
String x = (String) (1 > 2 ? new Object() : new String("sd"));
System.out.println(" 第一种方式 x = "+x);
Object y = 1 > 2 ? new Object() : new String("sd");
System.out.println("第二种方式 y = "+y);
}
}
运算符通常具有优先级,以便于进行运算。
优先级 | 描述 | 运算符 | 结合性 |
1 | 分隔符 | [ ] ( ) . , ; | 右到左 |
二、语句
语句定义:是程序的基本组成单元,一个软件就是一组语句的有序集合。描述了程序执行的内容。
语句可以按照结构划分为三种:
1.顺序结构:按前后顺序执行的语句体。
2.分支结构:选择执行一部分语句体。
3.循环结构:循环执行一块语句体。
2.1 If()语句:是分支结构也是循环结构
if ( <布尔表达式> ) {
满足布尔表达式时需要执行的语句体;
}
2.2 If--- elseif else 语句(中间可以加多个else if中间不能出现为else 而在else 后面有else if )
if( <布尔表达式1> ) {
满足布尔表达式1时需要执行的语句体;
} else if ( <布尔表达式2> ) {
不满足布尔表达式1,但满足表达式2时需要执行的语句体;
} else {
不满足布尔表达式1,也不满足表达式2时需要执行的语句体;
}
2.3 switch 语句的语法:
switch( <整型表达式> ) {
case <整型常量1> :
当整型表达式的值等于整型常量1时执行的语句;
break;
case <整型常量2> :
当整型表达式的值等于整型常量2时执行的语句;
break;
case <整形常量3> :
当整型表达式的值等于整型常量3时执行的语句;
break;
default:
当整型表达式的值不满足任何一个case的值时,执行的语句;
}
2.4 for循环语法(for循环的形式变化多样可以在编译器上打 for然后alt+/ 可以看看for循环的几种形式)
for ( <初始化循环因子>;<布尔型循环条件>;<循环因子步进> ) {
当循环因子满足布尔型循环条件时执行的语句,
当前一次循环执行完成后循环因子步进执行,
然后回到循环体首进行下一次循环;
}
2.5 while 循环语法(注意里面的布尔型循环条件里的类型应该是boolean类型,如果是1,0的话,会报错)
while ( <布尔型循环条件> ) {
当布尔型循环条件的值为真(true)时,执行的语句,
直到布尔型循环条件的值为假(false)时,退出循环;
}
2.6 do----while循环语法(该循环至少执行1次)
do {
执行语句,然后判断布尔型循环条件的值,
如果为真(true),则继续循环,否则退出循环;
} while ( <布尔型循环条件> );
2.7 continue关键字用法:
continue用于在循环体内,跳过continue之后的代码,回到循
环体首执行下一次循环。
2.8 break关键字用法:
break用于跳出当前循环体,结束循环。
几点注意:
1 For循环和while循环几乎可以互换,只是在有些场合谁更适合而已,if else同样可以和switch互换。
For循环因子是在循环体执行后执行的,而且要满足布尔型循环条件,否则for循环会退出。
2 For(;;){}代表无限循环,
while(true){}:代表无限循环
3.for,while,if,else,可以在程序中相互嵌套使用。
4.switch里的整型表达式可以用char,int ,long ,byte,short
5.switch里的case和break可以成对出现,也可以不用,通常可以用switch设计一个简单的菜单程序,
如果有好几个case后面没有break的话会输出这几个case后面的内容。Default是在所有case都不符合的条件下的操作,比如输入不合法的提示,
6while()可以一次都不循环,但是do()while()至少循环一次。所以有时候为了避免不必要的执行,通常用第一种方式
6.for循环中的初始化因子,布尔型变量,和步进因子可以不止一个。
7.可以用break跳出for循环,while循环,同样,可以用continue执行for循环的下一次循环,while循环的下一次循环。
8.当有多重for循环时,break跳出的只是所在的那一重循环,并没有跳出整个循环。Continue同样是执行所在循 环体的下一次循环。
9.Break与continue的区别是,break是因为某种条件而终止循环,而continue是因为某种条件而重新执行循环。
10.下面是笔者在做一份网站试题的总结,题目来源:问答网站
1.研究下面的Java代码:
switch(x) {
case1: System.out.println(1);
case2:
case3: System.out.println(3);
case4: System.out.println(4);
}
当x=2时,运行结果是( 3,4)。
2.System.out.println(4|3);能打印出什么结果?
答案为 7
3.在Java中,类Animal中的方法printA( )定义如下:
public void printA() {
int a = 10;
int result = 10%3;
System.out.println(result);
}
在类Dog中方法printA()定义如下:
public void printA() {
int a = 10;
System.out.println(a/3);
}
Dog类的定义如下:
class Dog extends Animal{…}.
Animal animal = new Dog();
animal.printA();
以上语句输出为( )
A 0
B 3(Y)
C 2
D 1
4.以下运算符按运算优先级从高到低排列顺序正确的是______
A !=,*,&&,>=
B !,*,<,= (Y)
C !,=,*,>=
D !,*,&&,>=
5.关于while和do-while循环,下列说法正确的是
A 这些都不对。
B 与while语句不同的是,do-while语句的循环至少执行一次(Y)
C do-while语句首先计算终止条件,当条件满足时,才去执行循环体中的语句
D 两种循环除了格式不通外,功能完全相同