内容概述
- 算数运算符
- 赋值运算符
- +运算符的特点
- 关系运算符
- 逻辑运算符
- 位运算符
- 三目运算符
- 接收控制台输入
算数运算符
1.+
2.-
3.*
4./
10 / 3 : 3
10 / 0 : 运行时异常;
10.0 / 0 :Infinity(无穷)不是异常
5.%(取余)
10 % 3 : 1
10 % 0 : 运行时异常
10.0 % 0 : NaN(Not A Number)不是异常
-10 % -3 :-1
10 % 3 :1
-10 % 3:-1
10 % -3:1
6.++:对变量自增1
7.--:对变量自减1
8.注意:++和--
1.++和--是对变量本身进行更改;自增1或自减1
2.它可以放在变量的前面,也可以放在变量的后面;
3.它在左右两边,必须是"变量",不能是"常量值"或"表达式";
4.如果表达式中,只做++和--,那么放在前或放在后,都一样;
但是,如果表达式还做其它事情,那么前++/--和后++/--效果就不一样了;
int num1 = 10;
int num2 = ++num1;//num2 = 11
int num2 = num1++;//num2 = 10;
赋值运算符
+=,-=,*=,/=,%=
上述运算符都自动带"强制转换"功能:
byte b1 = 10;
b1 = b1 + 20;//编译错误;b1 + 20结果为int,所以要用int接收
b1 += 20;//OK的;b1 = (byte)(b1 + 20);
赋值运算符"="它可以返回变量;
class Demo2
{
public static void main(String[] args)
{
int a = 10;
System.out.println(a = 20);//a = 20;System.out.println(a);
}
}
+运算符的特点
1.+运算符,如果左右两边是"数值"类型,那么就做加法运算:
2.如果左右两边,有一边是"字符串"类型,那么结果就做:字符串连接:
3."字符类型(char)"跟"整型"是兼容的类型;一个char类型,可以和一个数值类型做+,-,*,/等运算;在做运算时,char类型使用的底层的Unicode编码的值;
char c1 = 'a';
System.out.println(c1 + 1);//98
关系运算符
有些时候,我们需要让计算机为我们进行一些判断:
1.==:判断是否相等
2.!=:判断是否不等;
3.<:左操作数是否小于右操作数;
4.>:左操作数是否大于右操作数;
5.<=:左操作数是否小于或者等于右操作数;
6.>=:左操作数是否大于或者等于右操作数;
逻辑运算符
1.&&(并且):true && true 结果为:true,否则有一个为false,结果为false;(两边都为true,结果为true)
2.||(或者):true || false结果为:true;表达式中,(有一个为true,结果为true);
3.!(不是):非;!true为false,!false为true;
位运算符:
1.&(并且):结果跟&&一样
2.|(或者):结果跟||一样
3.^(异或):两位相同结果为false,不同,结果为true;
逻辑&&/||和按位&/|的区别:
2.|(或者):结果跟||一样
3.^(异或):两位相同结果为false,不同,结果为true;
&&/|| : 具有"短路"行为。一旦确定整个表达式的结果,那么不再计算剩余表达式;
int age = 20;
System.out.println(age >= 22 && ++age <= 25);//由于&&、||具有短路行为,所以++age没有被执行;
System.out.println(age >= 22 & ++age <= 25);//&、|不具有短路行为,所以会执行所有表达式;
位运算符1:&,|,^,~
1."位运算符"是对"整数"的"二进制"直接操作的运算符;我们现在使用的已经不多了,因为现在的计算机硬件已经非常快;
2.位运算符:
1).&(与):两位都为1,结果为1,否则结果为0;
System.out.println(3 & 2);
3的二进制:0000 0011
2的二进制:0000 0010
&
--------------
0000 0010
2).|(或):有一位为1,结果为1,其它都为0;
System.out.println(3 | 2);
3的二进制:0000 0011
2的二进制:0000 0010
|
---------------
0000 0011
3).^(异或):两位相同,结果为0,不同结果为1;
System.out.println(3 | 2);
3的二进制:0000 0011
2的二进制:0000 0010
^
--------------
0000 0001
4).~(取反):如果为1,结果取0,如果为0,结果取1;
System.out.println(~1);
1的二进制:0000 0001
~
------------
1111 1110(补码)
-1
--------------
1111 1101
取反
---------------
1000 0010 (-2)
注意:所有的位运算符对原值都不产生影响,不会改变原值,会产生一个新值;
3.习题:怎么样用一种高效的方式,交换两个变量的值:
int a = 10;
int b = 20;
//第一种方式,使用第三方变量:
int c = a;
a = b;
b = c;
//第二种方式,加法方式
a=a+b;
b=a-b;
a=a-b;
//使用三次异或操作;
a = a ^ b;
b = a ^ b;
a = a ^ b;
//一句话搞定
a=(a+b)-(b=a);
位运算符2:<<,>>,>>>
1.<< : 将整数的二进制,左移若干位;右侧补0;
左移一位,相当于原数 * 2
实际移动的位数 = 移动的位数 % 32
注意:一定要在"数值位"上移动,否则结果不可预知;
实际移动的位数 = 移动的位数 % 32
注意:一定要在"数值位"上移动,否则结果不可预知;
2.>> : 带符号的右移。将二进制数向右移动若干位,左侧补原符号位的值(原符号位为0,左侧补0;原符号位为1,左侧补1)
右移一位,相当于原数 / 2
正数:无论右移多少位,结果仍然为正数;
负数:无论右移多少位,结果都是负数;
3.>>>: 无符号右移。右移若干位,左侧补0;
负数,只要右移一位,结果为正;
右移一位,相当于原数 / 2
正数:无论右移多少位,结果仍然为正数;
负数:无论右移多少位,结果都是负数;
3.>>>: 无符号右移。右移若干位,左侧补0;
负数,只要右移一位,结果为正;
4.习题:如何使用高效的方式计算:2 * 8;
System.out.println(2 << 3);//左移三次
System.out.println(8 << 1);//左移一次;
注意:左移,或右移,都不会改变原值,而是产生一个新值;
三目运算符
关系表达式 ? 表达式1 : 表达式2;
说明:
1.关系表达式:一定要是一个产生true或false结果的一个表达式,它可以关系运算符以及逻辑运算符;
2.如果"关系表达式"返回true,执行"表达式1";如果"关系表达式"返回false,执行"表达式2";
注意:
1.三目运算符中的"表达式1"和"表达式2"一定要返回一个变量,或者值。不能是其它语句:
接收控制台输入
步骤:
1.导入包;在class的定义之前,写如下语句:
import java.util.Scanner;
2.实例化对象:在main()方法中,写如下语句:
Scanner sc = new Scanner(System.in);
3.接收用户输入:
1).接收整数:
int num = sc.nextInt();
2).接收字符串:
String str = sc.next();
3).接收一个浮点值:
double val = sc.nextDouble();