当前位置:   article > 正文

java中的算术运算符【详解】_java算术运算符

java算术运算符

一、引言

  在java基础学习中,运算符是特别重要的基本知识,它可以操作数据来实现我们的需求。java中最基本的运算符包括算术运算符、赋值运算符、逻辑运算符和关系运算符等,本文我们选择算术运算符进行讲解

二、算术运算符

1,概念

  Java 中的算术运算符主要用来组织数值类型数据的算术运算,按照参加运算的操作数的不同可以分为一元运算符和二元运算符,这里说明一下,n元运算符表示只有n个操作数与该运算符才能构成完整的表达式;例如i++表达式中 ++ 为一元运算符,a+b表达式中 + 为二元运算符。

2,一元运算符(++、- -)

1. ++运算符

(1)作用:对操作数完成自增的操作,举例:

int i = 1;
i++;
System.out.println("i = " + i);
  • 1
  • 2
  • 3

控制台输出结果:

i = 2
  • 1
(2)注意事项

  ①只能操作数值型变量不能操作常量,浮点数也可以使用 ++ 运算符,举例:

double d = 3.14;
d++;//正确使用
2++;//错误使用
  • 1
  • 2
  • 3

  ②自增(自减)运算符一般会单独使用,用于循环控制

  ③ ++ 和变量顺序不同返回结果也不同,规则如下:

   A. i++:若和其他运算符需要运算是先参与运算然后在自增

   B. ++i:若和其他运算符需要运算是先自增然后在参与运算

举例:

int number = i++ + ++i + ++i;
//number = 0(++在后先参与运算) + 2(++在前先自增) + 3(++在前先自增);
System.out.println("number = " + number + " i = " + i);
  • 1
  • 2
  • 3

控制台输出结果:

number= 5 i = 3
  • 1

​  ++ 运算符其原理如下图 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);
  • 1
  • 2
  • 3
  • 4

控制台输出结果:

i = 0 j = 1
  • 1
2. --运算符
(1)作用:对操作数完成自减的操作,举例:
int i = 1;
i--;
System.out.println("i = " + i);
  • 1
  • 2
  • 3

控制台输出结果:

i = 0
  • 1
(2)注意事项类比与上文的++运算符

3,二元运算符(+、-、*、/、%)

1. 算术表达式中不同基本数据类型操作数参与运算规则

(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码参与运算

2. + 运算符

(1)两个操作数均为基本数据类型,则采用上文的基本数据类型运算规则

作用:对两个操作数完成加操作,举例:

int a = 1,b = 2;
System.out.println("a + b = " + (a + b));//提高a+b的优先级
  • 1
  • 2

​ 控制台输出结果:

a + b = 3
  • 1

(2)其中一个操作数或两个操作数为String类型,则表示字符串的拼接

作用:对两个操作数完成字符串的拼接,举例:

String s = "aa";
int i = 1;
System.out.println("s + i = " + (s + i));
  • 1
  • 2
  • 3

​ 控制台输出结果:

s + i = aa1//字符串类型
  • 1

  在java中字符串的 + 操作其原理就是创建StringBuilder对象调用append()方法完成,如图 2.2所示:


                       图2.2 字符串+底层原理

  由上图可知每次进行一次字符串的+操作都会创建一个StringBuilder对象,会导致内存空间的利用率降低

  这里说明一下,java中只有 + 运算符操作数可以不为基本数据类型,而 - 、 * 、 / 、 % 操作符的操作数只能为基本数据类型,且都遵守上文中的不同基本数据类型的运算规则

3. - 运算符

作用:对两个操作数完成减操作,举例:

int a = 3,b = 2;
System.out.println("a - b = " + (a - b));
  • 1
  • 2

控制台输出结果:

a - b = 1
  • 1
4. * 运算符

作用:对两个操作数完成乘操作,举例:

int a = 2,b = 2;
System.out.println("a * b=" + (a * b));
  • 1
  • 2

控制台输出结果:

a * b = 4
  • 1
4. / 运算符

作用:对两个操作数完成除操作,举例:

int a = 5,b = 2;
System.out.println("a / b = " + (a / b));
  • 1
  • 2

控制台输出结果:

a / b = 2
  • 1

  这里有个问题,为什么控制台的结果不是2.5呢?原因是根据上文的基本数据类型运算规则得到表达式为int类型,所以表达式结果进行了强制类型转换;若想要得到浮点类型,只需要在表达式前面加上1.0 * 即可,举例:

int a = 5,b = 2;
System.out.println("a / b = " + (1.0 * a / b));
  • 1
  • 2

控制台输出结果:

a / b = 2.5
  • 1
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);//左侧为+
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

控制台输出结果:

0 % 5 = 0
-15 % 6 = -3
-15 % -6 = -3
15 % -6 = 3
15 % 6 = 3
  • 1
  • 2
  • 3
  • 4
  • 5

(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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

​ 控制台输出结果:

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

三、算术运算符的优先级

  当一个表达式中含有多个算术运算符时就会出现运算的先后顺序,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');//直接进行字符串的连接
  • 1
  • 2
  • 3
  • 4

控制台输出结果:

4
68string
string3A
  • 1
  • 2
  • 3

四、结语

  我们学习java时需要重视其在计算机底层中是如何实现的,这样我们才能更好地把计算机理论知识与java相结合,可以对java的理解更加深入。最后,感谢大家的观看!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/290888
推荐阅读
相关标签
  

闽ICP备14008679号