赞
踩
在java基础学习中,运算符是特别重要的基本知识,它可以操作数据来实现我们的需求。java中最基本的运算符包括算术运算符、赋值运算符、逻辑运算符和关系运算符等,本文我们选择算术运算符进行讲解
Java 中的算术运算符主要用来组织数值类型数据的算术运算,按照参加运算的操作数的不同可以分为一元运算符和二元运算符,这里说明一下,n元运算符表示只有n个操作数与该运算符才能构成完整的表达式;例如i++表达式中 ++ 为一元运算符,a+b表达式中 + 为二元运算符。
(1)作用:对操作数完成自增的操作,举例:
int i = 1;
i++;
System.out.println("i = " + i);
控制台输出结果:
i = 2
①只能操作数值型变量不能操作常量,浮点数也可以使用 ++ 运算符,举例:
double d = 3.14;
d++;//正确使用
2++;//错误使用
②自增(自减)运算符一般会单独使用,用于循环控制
③ ++ 和变量顺序不同返回结果也不同,规则如下:
A. i++:若和其他运算符需要运算是先参与运算然后在自增
B. ++i:若和其他运算符需要运算是先自增然后在参与运算
举例:
int number = i++ + ++i + ++i;
//number = 0(++在后先参与运算) + 2(++在前先自增) + 3(++在前先自增);
System.out.println("number = " + number + " i = " + i);
控制台输出结果:
number= 5 i = 3
++ 运算符其原理如下图 2.1:
图2.1 ++ 运算符原理
明白原理后,则下列表达式根据图 2.1原理便可得到输出结果
int i = 0 , j = 0;
i = i++;//返回oldValue然后赋值给i,i = 0
j = ++j;//返回自增后的*this然后赋值给j,j = 1
System.out.println("i = " + i + " j = " + j);
控制台输出结果:
i = 0 j = 1
int i = 1;
i--;
System.out.println("i = " + i);
控制台输出结果:
i = 0
(1)两个操作数类型(double,<double):低于double类型的操作数先自动转换为double类型再进行算术运算;整个表达式的类型为double
(2)两个操作数类型(float,<float):低于float类型的操作数先自动转换为float类型再进行算术运算;整个表达式的类型为float
(3)两个操作数类型(long,<long):低于long类型的操作数先自动转换为long类型再进行算术运算;整个表达式的类型为long
(4)两个操作数类型(<long,<long):所有操作数都自动转换为int类型再进行算术运算;整个表达式的类型为int;注意这里我们可以把char类型看做特殊的整型变量,它可使用ASCII码参与运算
(1)两个操作数均为基本数据类型,则采用上文的基本数据类型运算规则
作用:对两个操作数完成加操作,举例:
int a = 1,b = 2;
System.out.println("a + b = " + (a + b));//提高a+b的优先级
控制台输出结果:
a + b = 3
(2)其中一个操作数或两个操作数为String类型,则表示字符串的拼接
作用:对两个操作数完成字符串的拼接,举例:
String s = "aa";
int i = 1;
System.out.println("s + i = " + (s + i));
控制台输出结果:
s + i = aa1//字符串类型
在java中字符串的 + 操作其原理就是创建StringBuilder对象调用append()方法完成,如图 2.2所示:
图2.2 字符串+底层原理
由上图可知每次进行一次字符串的+操作都会创建一个StringBuilder对象,会导致内存空间的利用率降低
这里说明一下,java中只有 + 运算符操作数可以不为基本数据类型,而 - 、 * 、 / 、 % 操作符的操作数只能为基本数据类型,且都遵守上文中的不同基本数据类型的运算规则
作用:对两个操作数完成减操作,举例:
int a = 3,b = 2;
System.out.println("a - b = " + (a - b));
控制台输出结果:
a - b = 1
作用:对两个操作数完成乘操作,举例:
int a = 2,b = 2;
System.out.println("a * b=" + (a * b));
控制台输出结果:
a * b = 4
作用:对两个操作数完成除操作,举例:
int a = 5,b = 2;
System.out.println("a / b = " + (a / b));
控制台输出结果:
a / b = 2
这里有个问题,为什么控制台的结果不是2.5呢?原因是根据上文的基本数据类型运算规则得到表达式为int类型,所以表达式结果进行了强制类型转换;若想要得到浮点类型,只需要在表达式前面加上1.0 * 即可,举例:
int a = 5,b = 2;
System.out.println("a / b = " + (1.0 * a / b));
控制台输出结果:
a / b = 2.5
(1)两个操作数为整数时取余运算规则
①如果右侧操作数为零,则结果报错
②如果左侧操作数为零,则结果为0
③其他情况结果的符号与左侧操作数的符号相同
举例:
//整型取余规则
//System.out.println(5 % 0);//1,右侧操作数为零,则结果报错
System.out.println("0 % 5 = " + 0 % 5);//2,左侧操作数为零
//3,其他情况结果的符号与左侧操作数的符号相同
System.out.println("-15 % 6 = " + -15 % 6);//左侧为-
System.out.println("-15 % -6 = " + -15 % -6);//左侧为-
System.out.println("15 % -6 = " + 15 % -6);//左侧为+
System.out.println("15 % 6 = " + 15 % 6);//左侧为+
控制台输出结果:
0 % 5 = 0
-15 % 6 = -3
-15 % -6 = -3
15 % -6 = 3
15 % 6 = 3
(2)一个或两个操作数为浮点数时取余
①如果右侧操作数为零,则结果为NaN(非数值)
②如果左边的操作数是无穷大,结果是NaN
③如果右边的操作数是无穷大,结果是左边操作数的值
④如果任一操作数是NaN,结果是NaN
⑤其他情况与整型规则3一样;由于是浮点数运算,可能会存在浮点数的舍入误差
举例:
//浮点取余规则
System.out.println(15.0F % 0.0F);//1,右侧操作数为零
System.out.println(Float.POSITIVE_INFINITY % 2.1F);//2,左边的操作数是无穷大
System.out.println(2.1F % Float.POSITIVE_INFINITY);//3,右边的操作数是无穷大
//4,如果任一操作数是NaN,结果是NaN
System.out.println((Float.POSITIVE_INFINITY % 2.1F) % 2.0);//左边为NaN
System.out.println( 2.0 % (Float.POSITIVE_INFINITY % 2.1F));//右边为NaN
//5,其他情况与整型规则3一样(可能存在浮点数的舍入误差)
System.out.println( 15.5F % 6.5F);//结果为2.5F
System.out.println(5.5 % 15.65); //结果为5.5
System.out.println(0.0 % 3.78);//结果0.0
System.out.println( -15.5F % 7.5F);//结果为-0.5F
控制台输出结果:
15.0F % 0.0F = NaN
无穷大 % 2.1F = NaN
2.1F % 无穷大 = 2.1
NaN % 2.1F = NaN
2.1F % NaN= NaN
15.5F % 6.5F = 2.5
5.5 % 15.65 = 5.5
0.0 % 3.78 = 0.0
-15.5F % 7.5F = -0.5
当一个表达式中含有多个算术运算符时就会出现运算的先后顺序,java中算术运算符的先后顺序为:【++ or - -】 > 【* or / or %】 > 【+ or -】,举例:
System.out.println(3 + 4 * 5 % 6 / 2);//相当于(((4 * 5) % 6 )/ 2) + 3 = 4
//字符串的 + 操作
System.out.println(3+'A'+"string");//先进行3+'A'操作然后再进行字符串的连接
System.out.println("string"+3+'A');//直接进行字符串的连接
控制台输出结果:
4
68string
string3A
我们学习java时需要重视其在计算机底层中是如何实现的,这样我们才能更好地把计算机理论知识与java相结合,可以对java的理解更加深入。最后,感谢大家的观看!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。