这篇文章,我们来讲一下运算符和类型转换
目录
1.运算符概述
下面,我们来讲一下运算符
1.1概述
运算符:对字面量或者变量进行操作的符号
Java的运算符有许多种,这里主要介绍下面几种:算术运算符,自增自减运算符,赋值运算符,关系运算符,逻辑运算符,三元运算符,位运算符
表达式:用运算符把字面量或者变量连接起来,符合java语法的式子就可以称为表达式。不同运算符连接的表达式体现的是不同类型的表达式。
举例说明:
int a = 10;
int b = 20;
int c = a+b;
说明:
- +:是运算符,并且是算术运算符
- a+b:是表达式,因为+是算术运算符,所以这个表达式称为算术表达式
1.2 算术运算符
下面来介绍一下算术运算符
1.2.1具体介绍
算术运算符 即包括“ + - * / % ”这5类运算符
“+”运算
语法 :a = b + c;
注意:a,b,c必须为同类型的数,或者满足数据类型的自动转换
变形:a += b; 等价于 a = a + b ;
其余的 - * 全都类似
拓展:
public static void main(String[] args) {
System.out.println(1.02+3.14);
System.out.println(1.1+2.2);
}
结论:
在代码中,如果有小数参与运算,结果有可能不精确。!!!!
原因是什么呢?暂时不说,后面会讲
“ / ”运算符
语法(看下面的代码):
public static void main(String[] args) {
System.out.println(9/2);
}
结论:整数参与运算,那么结果就只能是整数!!!
“ % ”运算符
语法(看下面代码):
public static void main(String[] args) {
System.out.println(9%2);
System.out.println(9%3);
}
1.2.2算术运算符小结
下面小结一下算术运算符
结论:
- + - * 的运算同数学运算一样
- 整数参与运算,结果只能得到整数
- 小数参与运算,结果可能是不精确的,如果需要精确的结果,后面会讲
%的运用场景:
- 可以用取模运算符来判断两个数是否可以被整除
- 可以判断一个数是否为偶数
1.2.3小练习
需求:键盘录入一个三位数,将其拆分为个位,十位,百位后,打印输出在控制台
代码如下:
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入一个三位数:");
int a = scanner.nextInt();
System.out.println("个位:"+(a%10));
System.out.println("十位:"+((a/10)%10));
System.out.println("百位:"+((a/100)%10));
}
1.2.4 “+”的高级运算
这个主要就是基本类型转换了,详细的请看下面
1.2.5 字符串的“+”操作
当“+”操作出现在字符串中时,这个“+”就是字符串连接符,而不是算术运算符,它会将前后的数据进行拼接,并产生一个新的字符串。当连续进行“+”操作时,是从左到右依次进行。
看一下下面的这个代码:
System.out.println(1+2+"abc"+4+5);
结果为:3abc45
1.2.6字符的“+”
我们有这样的一个规则:byte,short,char三种类型的数据在运算的时候,都会先提升为int,然后再运算。
那么字符的“+”是这样的:
当 字符+字符或字符+数字 时,会把字符通过ASCII码表查询到对应的数字再进行计算。
我们可以看一下下面的代码及其结果:
public class ArithmeticoperatorDemo1 {
public static void main(String[] args) {
System.out.println('a'+'b');
System.out.println('a'+1);
}
}
很神奇,对不对?所以要常验证。
其实上面的所有的“+”都会要考虑到类型转换!!!
1.3自增自减运算符
自增运算符:++
自减运算符:--
1.3.1 ++运算
++:实现变量的自增,就是变量的值加1
例如:
int a = 0 b = 0 ;
int x = 0 y = 0 ;
a = b++; // a=0,b=1
x = ++y; // x=1,y=1
解析:
前置:先进性自增运算,y值+1后再进行其他运算;
后置:先进性其他运算,后进行自增运算;
特别的:b=b++ ;等价于 b=b,b=b+1;两句
问:下面代码输出多少?
int a = 0 ;
for(int i = 0 ;i < 10 ; i++)
a = a++;
System.out.println(a);
答:输出0(这个涉及到运算符的优先级,后面会讲)
1.3.2 --运算
与上面的++运算类似,这里比不过多赘述
1.4 赋值运算符
赋值运算符 即 “=”
语法:a = b ;
作用:将b的值赋给a,在运算过程中就包括了数据类型的自动转换
注意:与“ == ”区别
拓展:
代码演示:
public class ArithmeticoperatorDemo1 {
public static void main(String[] args) {
short a = 1;
a += 2;
System.out.println(a);
System.out.println(getType(a));
}
//获取变量的类型
public static String getType(Object obj) {
return obj.getClass().getName();
}
}
结果:
注意:扩展的赋值运算符,它里面蕴含了强制类型转换!!!(一定要注意)
1.5关系运算符
下面,我们来看一下关系运算符:
注意:
- 关系运算符的结果都是boolean类型的,要么是true,要么是false
- 不要把“==”误写为“=”
1.6逻辑运算符
下面,我们来看一下java中的逻辑运算符
1.6.1四元逻辑运算符
首先,我们来看一下四元逻辑运算符(就是最简单的逻辑运算符)
这是一个比较有意思的运算符,下面来具体的讲一下
看下面的代码:
public class ArithmeticoperatorDemo2 {
public static void main(String[] args) {
System.out.println(false&false);
System.out.println(!false);
}
}
结果如下:
这是最简单了,就是两个boolean类型的值之间进行逻辑运算,结果也为boolean类型,很简单。
再看下面的代码:
public class ArithmeticoperatorDemo2 {
public static void main(String[] args) {
//1011
//1001
//1001=9
System.out.println(11&9);
//011
//101
//001=1
System.out.println(3&5);
//011
//100
//000=0
System.out.println(3&4);
System.out.println(3^4);
System.out.println(3|4);
}
}
看下结果:
结论:
- 当数字运用四元逻辑运算符时,会先转换为二进制数,然后再按逻辑运算符的准则进行运算,最后运算的结果再转换为10进制数输出
- 当数字用&时,会讲数字转化为二进制数,此时比较二进制数的每一位,相同且为1时,结果为1,否则为0
1.6.2短路逻辑运算符
下面,我们来看一下短路逻辑运算符
什么叫短路?
简单理解:当左边的表达式能确定最终的结果,那么右边就不会参与运算了
下面看一个例子:
public class ArithmeticoperatorDemo2 {
public static void main(String[] args) {
int a = 10;
int b = 10;
boolean result = ++a < 5 && ++b < 5;
System.out.println(result);
System.out.println(a);
System.out.println(b);
}
}
结果如下图所示:
解释:前面的结果出来了,然后整个表达式的结果就出来了,那么后面就不执行了
下面说一下注意事项:
1.7三元运算符
三元运算符,又称为三元表达式
格式如下:关系表达式?表达式1:表达式2
解释:会先运算关系表达式,如果关系表达式为真,则运行表达式1,关系表达式为false,则运行表达式2
注意:三元表达式必须要赋予一个变量会使用,不能直接写一下三元表达式放在那里,会报错的
范例:求两个数中的较大值
public class ArithmeticoperatorDemo2 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int a = scanner.nextInt();
int b = scanner.nextInt();
System.out.println("较大的值为:" + (a>b?a:b));
}
}
结果:
1.8 位运算符
处理整型类型时,可以直接对组成整型数值的各个位完成操作。这意味着可以使用掩码 技术得到整数中的各个位。位运算符包括:
运算实质:以 & 为例:
将数值转化为二进制数,从低位到高位对齐排列,位数不够0来凑,按照&(与)的运算法则进行运算(相同取1,不同取0)得到一个二进制数,赋予变量,然后输出。其余几个都类似
注意:
(1)>>> 右移运算符,高位用0补,注意与 >> 的区别
(2)n进制数右移m位,变为原来的 n^(-m)倍
(3)左移一定的位数,数的正负会变(符号位可能变)
补充:移位符与赋值符结合
注意:这个其实与逻辑运算符有重叠的部分,大家知道就好
1.9运算符的优先级
下面来讲一下运算符的优先级
记住一点:()优先于所有!!!
2.不同数据类型之间的转换
在Java程序书写过程中,常常需要将一种数据类型转换为另外一种数据类型。下图给出了数据类型间的合法转换,实箭头表示无信息丢失的转换,虚箭头表示可能有信息损失的转换
1.1自动转换
自动转换,即上图实箭头,即无信息丢失的转换,主要是指小类型数遇见大类型数会自动转换为大类型数(即小见大,则变大)
如下面语句:
int a = 10 ;
double b = a + 3.14 ; //正确,a自动转换为double型
若改下面的,则会报错:
double a = 3.14 ;
int b = a + 10 ; //报错,无法执行
实质:与各类型所占内存空间有关,大类型所占空间大,可以囊括小类型数
注意:“最大的是字符串”,任何类型数见到字符串会转换为字符串,如下面语句:
String a = "5" ;
int b = 4 ;
a = a + b ;
System.out.println(a); // 输出显示 54
1.2 强制类型转换
语法:变量a = (小类型) 变量b;其中 变量a 为小类型数,变量b为大类型数
例如:
double a = 3.14 ;
int b ;
b = (int) a ;
System.out.println(b); //输出显示 3
精度损失的原因:大类型数转换为小类型数时可能会因为内存开辟的空间不够而造成数据的损失
解决方法:少用
3.小结
这篇文章我们讲了运算符和进制转换,都属于基础知识,要掌握。