深入理解 Java 基本语法之运算符

news2024/11/27 7:17:36

(一)研究背景

在 Java 编程中,运算符是处理数据和变量的基本工具,掌握各种运算符的使用方法对于提高编程效率至关重要。

(二)研究目的

深入理解 Java 基础运算符的概念、分类和作用,通过具体案例分析,帮助开发者更好地运用运算符进行编程。

Java 中的运算符在编程中起着至关重要的作用,它们能够对数据进行各种操作,从而实现复杂的逻辑和计算。本报告将深入探讨 Java 基础运算符,包括算术运算符、赋值运算符、比较运算符、逻辑运算符、位运算符和三元运算符等。

二、Java 基础运算符概述

(一)算术运算符

  1. 一元运算符
    • Java 语言中的算术一元运算一共有 3 个,分别是 -、++ 和 --。
    • 具体来说,负号(-)用于表示取负数;自增运算符(++)将变量的值增加 1;自减运算符(--)将变量的值减少 1。
  1. 二元运算符
    • 除了常用的加(+)、减(-)、乘(*)和除(/)外,还有取模运算(%)。
    • 加、减、乘、除的运算规则与我们平常接触的数学运算相同。例如,两个整数相加、相减、相乘或相除,得到的结果也是整数。但需要注意的是,整数除法会取整,而小数参与运算时结果可能不精确。
    • 取模运算用于返回两个数值相除的余数。例如,10 % 3 的结果为 1。

(二)赋值运算符

其语法格式为:变量名称 = 表达式内容。

此外,还有复合赋值运算符,如 +=、-=、*=、/=、%= 等。这些运算符在进行运算时,会先对变量进行相应的运算,然后将结果赋值给变量。例如,a += 2 相当于 a = a + 2。

(三)比较运算符

  1. 关系表达式
    • 关系表达式是由关系运算符连接起来的表达式。关系运算符包括 ==、!=、>、<、>=、<= 等。
    • 关系运算符用于比较两个数据的大小关系或是否相等。例如,a > b 用于判断 a 是否大于 b,如果是,则返回 true,否则返回 false。
  1. 注意事项
    • 基本类型的变量、值不能和引用类型的变量、值使用 == 进行比较。
    • boolean 类型的变量、值不能与其他任意类型的变量、值使用 == 进行比较。
    • 如果两个引用类型之间没有父子继承关系,那么它们的变量也不能使用 == 进行比较。
    • 关系运算符的优先级高于赋值运算符而低于算术运算符,结合方向是自左向右。

(四)逻辑运算符

  1. 逻辑与(&&)和逻辑或(||)
    • && 与 || 区别:如果 a 为 false,则不计算 b(因为不论 b 为何值,结果都为 false);如果 a 为 true,则不计算 b(因为不论 b 为何值,结果都为 true)。
    • 短路与(&&)和短路或(||)能够采用最优化的计算方式,从而提高效率。在实际编程时,应该优先考虑使用短路与和短路或。
  1. 逻辑非(!)
    • 逻辑非用于对操作数的布尔值取反。例如,!true 的结果为 false。
  1. 优先级
    • 逻辑运算符的优先级为:! 运算级别最高,&& 运算高于 || 运算。! 运算符的优先级高于算术运算符,而 && 和 || 运算则低于关系运算符。结合方向是:逻辑非(单目运算符)具有右结合性,逻辑与和逻辑或(双目运算符)具有左结合性。

(五)位运算符

  1. 位逻辑运算符
    • 位逻辑运算符包含 4 个:&(与)、|(或)、~(非)和 ^(异或)。除了 ~(即位取反)为单目运算符外,其余都为双目运算符。
    • 位运算符用于对整数的二进制位进行操作。例如,& 对两个整数的每一位执行逻辑与操作;| 对两个整数的每一位执行逻辑或操作;^ 对两个整数的每一位执行逻辑异或操作;~ 对整数的每一位执行逻辑取反操作。
  1. 移位运算符
    • 移位运算符包括 <<(左移)、>>(右移)和 >>>(无符号右移)。
    • 左移运算符将整数的二进制表示向左移动指定的位数,右移运算符将整数的二进制表示向右移动指定的位数。无符号右移运算符在右移时,无论最高位是 0 还是 1,都用 0 填充。

(六)三元运算符

Java 提供了一个特别的三元运算符(也叫三目运算符),经常用于取代某个类型的 if-then-else 语句。条件运算符的符号表示为“?:”,使用该运算符时需要有三个操作数,因此称其为三目运算符。

使用条件运算符的一般语法结构为:result = ? : ;其中,expression 是一个布尔表达式。当 expression 为真时,执行 statement1,否则就执行 statement3。此三元运算符要求返回一个结果,因此要实现简单的二分支程序,即可使用该条件运算符。

例如:int x,y,z;x = 6,y = 2;z = x>y? x-y : x+y;

三、Java 基础运算符的应用案例

(一)算术运算符案例

  1. 数字相加
    • 数据类型不同不能运算,要先转成一样的。隐式转换(自动类型提升):取值范围小的转成取值范围大的,如 byte < short < int < long < float < double。
    • 强制转换:取值范围大的转成取值范围小的,需要手动转换,目标数据类型变量名 = (目标数据类型)被强转的数据。
  1. 字符串的 + 操作
    • 这里的 + 是字符串连接符,多个 + 从左到右依次执行。例如,“123”+123 结果是“123123”;1+99+“年美女”结果为“100年美女”。
  1. 字符相加
    • char 类型参与算术运算,使用的是计算机底层对应的十进制数值。需要记住三个字符对应的数值:‘a’ – 97,‘A’ – 65,‘0’ – 48。

(二)自增自减运算符案例

  1. 先用后加
    • int a = 10;int b = a++; // b = 10,a = 11。
  1. 先加后用
    • int a = 10;int b = ++a; // b = 11,a = 11。

(三)赋值运算符案例

注意:+=、-=、*=、/=、%= 底层都隐藏了一个强制类型转换。例如,short s = 1;s += 1;等同于 s = (short) (s + 1);

(四)关系运算符案例

结果都是布尔类型。例如,int a = 3;int b = 9;boolean flag = (a == b);System.out.println(flag); // 输出 false。

(五)逻辑运算符案例

  1. 逻辑与(&&)
    • int i = 10;int j = 20;int k = 30;System.out.println((i > j) && (i > k)); // false && false,输出 false。
  1. 逻辑或(||)
    • System.out.println((i > j) || (i > k)); // false || false,输出 false。
  1. 逻辑异或(^)
    • System.out.println((i > j) ^ (i > k)); // false ^ false,输出 false。
  1. 逻辑非(!)
    • System.out.println(!true); // false。

(六)位运算符案例

  1. 按位与(&)
    • int a = 5;int b = 4;System.out.println(a & b); // 二进制:0000 0101 & 0000 0100 = 4。
  1. 按位或(|)
    • System.out.println(a | b); // 二进制:0000 0101 | 0000 0100 = 5。
  1. 按位异或(^)
    • System.out.println(a ^ b); // 二进制:0000 0101 ^ 0000 0100 = 1。
  1. 按位取反(~)
    • System.out.println(~a); // 二进制:1000 0110 = -6。
  1. 左移运算符(<<)
    • System.out.println(a << 2); // 二进制:0001 0100 = 20。
  1. 右移运算符(>>)
    • System.out.println(a >> 1); // 二进制:0000 0010 = 2。
  1. 无符号右移运算符(>>>)
    • System.out.println(a >>> 1); // 二进制:0000 0010 = 2。

(七)三元运算符案例

int max = a > b? a : b;System.out.println(a > b? a : b);

四、结论

Java 基础运算符在编程中起着至关重要的作用。通过对算术运算符、赋值运算符、比较运算符、逻辑运算符、位运算符和三元运算符的深入理解和应用,可以提高编程效率,实现更加复杂的逻辑和计算。在实际编程中,应根据具体需求选择合适的运算符,并注意运算符的优先级和结合性,以避免出现错误的结果。同时,合理使用运算符可以使代码更加简洁、易读和高效。

二、Java 运算符概述

(一)运算符的定义

运算符是对常量或者变量进行操作的符号,用于执行各种运算和操作。

(二)运算符的分类

  1. 按操作数数目分类:单目运算符、双目运算符、三目运算符。Java 中的运算符按照操作数的数目可以分为三类。单目运算符只有一个操作数,比如自增运算符(++)和自减运算符(--)等。双目运算符有两个操作数,例如加(+)、减(-)、乘(*)、除(/)等。三目运算符有三个操作数,如条件运算符(?:)。
  1. 按功能分类:赋值运算符、算术运算符、关系运算符、逻辑运算符、位运算符、条件运算符等。
    • 赋值运算符的语法格式为变量名称 = 表达式内容,此外还有复合赋值运算符如 +=、-=、*=、/=、%= 等。这些运算符在进行运算时,会先对变量进行相应的运算,然后将结果赋值给变量。
    • 算术运算符包括一元运算符和二元运算符。一元运算符有 -、++ 和 --,分别用于取负数、自增和自减操作。二元运算符有加、减、乘、除、取模等,用于进行基本的数学运算。
    • 关系运算符用于比较两个数据的大小关系或是否相等,包括 ==、!=、>、<、>=、<= 等。关系表达式是由关系运算符连接起来的表达式,其结果为布尔类型。
    • 逻辑运算符有逻辑与(&&)、逻辑或(||)、逻辑非(!)等,用于进行逻辑运算。逻辑与和逻辑或存在短路现象,能够提高效率。
    • 位运算符用于对整数的二进制位进行操作,包括位逻辑运算符和移位运算符。位逻辑运算符有 &(与)、|(或)、~(非)和 ^(异或),移位运算符有 <<(左移)、>>(右移)和 >>>(无符号右移)。
    • 条件运算符也叫三目运算符,符号为“?:”,用于取代某些简单的 if-then-else 语句,根据一个布尔表达式的结果来选择执行两个不同的语句。

三、算术运算符

(一)基本算术运算符

  1. 加法(+)作为正数、加法运算和字符串连接符号:
    • 作为正数时,如+5表示正五。
    • 作为加法运算,用于两个数值相加,例如3 + 5结果为8。
    • 作为字符串连接符号,多个字符串可以通过+连接在一起。例如,“Hello”+“World”结果是“HelloWorld”。
  1. 减法(-)作为负号和减法运算:
    • 作为负号时,如-5表示负五。
    • 作为减法运算,用于两个数值相减,例如10 - 4结果为6。
  1. 乘法(*)和除法(/)遵循基本数学运算规则,整数相除结果为整数,小数参与运算可能不精确:
    • 乘法运算,例如6 * 7结果为42。
    • 除法运算,当两个整数进行除法运算时,结果会自动舍去小数部分,只保留整数部分。例如10 / 4结果为2。如果需要得到精确的小数结果,可以将其中一个操作数转换为浮点数,如10.0 / 4结果为2.5。
  1. 取模(%)求余数,与除法相关:
    • 取模运算用于返回两个数值相除的余数。例如,10 % 3的结果为1。取模运算符的结果的符号与被除数的符号相同。例如,-5 % 3的结果是-2,而5 % -3的结果是2。

(二)自增自减运算符

  1. 用法放在变量后面(后++/后--),先运算后自增/自减。放在变量前面(先++/先--),先自增/自减后运算:
    • 后++/后--:变量在使用后进行自增/自减操作。例如,int a = 10;int b = a++;这里b = 10,先将a的值赋给b,然后a自增为11。
    • 先++/先--:变量先进行自增/自减操作,然后再被使用。例如,int a = 10;int b = ++a;这里b = 11,先将a自增为11,然后将a的值赋给b。
  1. 单独使用时无区别:
    • 当自增、自减运算符单独使用的时候都是对变量进行增加或者减少1的运算,既可以放在变量的前面也可以放在变量的后面。例如,int i = 1;i++;和int j = 1;++j;,最终i和j的值都为2。

四、赋值运算符

(一)基本赋值运算符(=)

将右侧的值赋给左侧的变量。基本赋值运算符在 Java 中是最基础的赋值方式,例如int a = 5;这行代码定义了一个名为a的变量,并将数字 5 赋值给它。当赋值发生时,Java 虚拟机会在内存中为变量分配空间,并将表达式的值存储在这个空间中。如果变量之前已经被赋值,新的赋值操作将覆盖之前的值。同时,数据类型在赋值时起着关键作用,Java 是强类型语言,赋值时必须确保值的数据类型与变量的数据类型匹配,否则编译器会报错。不过,Java 也支持自动类型转换来减轻这种限制,例如将 int 类型赋值给 long 类型的变量时会自动进行类型转换。

(二)扩展赋值运算符

  1. 如 +=、-=、*=、/= 等。Java 提供了一系列复合赋值运算符,包括+=、-=、*=、/=、%=等。使用这些运算符可以简化代码,让其更加清晰。例如int a = 5;a += 3;相当于a = a + 3;。
  1. 本质是算术运算符和位运算符与赋值运算符的结合体。这些扩展赋值运算符本质上是算术运算符和位运算符与赋值运算符的结合体。以+=为例,它把左边和右边做加法,然后把结果赋值给左边。例如int a = 10;int b = 20;a += b;等同于a = (int)(a + b);。扩展赋值运算符其中隐含了一个强制类型转换,强转的类型是左边变量的类型所决定的。例如short s = 1;s += 1;等同于s = (short)(s + 1);。
  1. 具有提高编译速度、编写速度和自动强制类型转换等优点,但也存在不利于阅读和可能出现精度问题的缺点。扩展赋值运算符具有一些优点,如提高执行效率,自动强制转换类型等。在进行迭代计算时特别有用。然而,它也存在一些缺点,比如不直观,可能会因为隐式转换而导致数据丢失,特别是在处理浮点数和整数之间的转换时。同时,在阅读代码时,可能不如基本赋值运算符和算术运算符的组合那么清晰易懂。

五、关系运算符

(一)作用

关系运算符用于比较两个值的大小和关系。

(二)常见关系运算符

Java中的常见关系运算符有==(等于)、!=(不等于)、>(大于)、<(小于)、>=(大于等于)、<=(小于等于)。

(三)返回值

关系运算符的结果一定是布尔类型,要么是 true,要么是 false。关系运算符的优先级为:>、<、>=、<= 具有相同的优先级,并且高于具有相同优先级的!=、==。关系运算符的优先级高于赋值运算符而低于算术运算符,结合方向是自左向右。关系表达式经常在 if 结构的条件中或者循环结构的条件中使用。关系运算符组成的表达式,我们称为关系表达式。

例如:

int a = 6;

int b = 3;

System.out.println(a > b); // true

System.out.println(a >= b); // true

System.out.println(a < b); // false

System.out.println(a <= b); // false

System.out.println(a == b); // false

System.out.println(a!= b); // true

boolean p1 = a > b; // true

System.out.println("p1=" + p1); // p1=true

关系运算符通常用于条件判断、数据验证、排序算法和用户权限控制等场景。其优点是简单直观、适用广泛且灵活性高,支持多种数据类型。缺点是只能用于比较基本数据类型,不适用于比较对象的内容(需使用.equals()方法);在某些情况下,不同数据类型之间的比较可能需要类型转换,可能导致精度问题;复杂的逻辑判断可能导致代码的可读性下降,需要合理安排逻辑结构。

六、逻辑运算符

(一)分类及作用

  1. &(逻辑与)、|(逻辑或)、^(逻辑异或)、!(逻辑非)。
    • &(逻辑与):当两个操作数都为true时,结果才为true,否则为false。
    • |(逻辑或):当两个操作数至少有一个为true时,结果为true,否则为false。
    • ^(逻辑异或):当两个操作数不同时,结果为true,相同时为false。

-!(逻辑非):用于对操作数的布尔值取反,如!true的结果为false。

  1. &&(短路与)、||(短路或)。
    • &&(短路与):如果第一个表达式返回false,后面的表达式不再执行。
    • ||(短路或):如果第一个表达式返回true,后面的表达式不再执行。
  1. 用于逻辑判断,连接 boolean 类型的表达式或值。

(二)短路逻辑运算符特点

  1. &&:如果第一个表达式返回 false,后面的表达式不再执行。
    • 例如在做题时遇到的逻辑预算符的“短路特性”,如果 Java 虚拟机发现&&左方的表达式为false,则它不需要也不会去计算&&右方表达式才知道要返回false。
  1. ||:如果第一个表达式返回 true,后面的表达式不再执行。
    • 同理,如果 Java 虚拟机发现||左方的表达式为true,则它不需要也不会去计算||右方表达式才知道要返回true。例如求 1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C),可以利用逻辑或的短路特性实现递归终止。当n==0时,(n>0)&&((sum+=Sum_Solution(n-1))>0)只执行前面的判断,为false,然后直接返回 0;当n>0时,执行sum+=Sum_Solution(n-1),实现递归计算Sum_Solution(n)。

在 Java 的逻辑与和逻辑或运算中,短路与&&和短路或||具有短路特性,在某些情况下可以提高效率并避免潜在的错误。例如:

 

int ia = 3;

int ib = 2;

boolean b3 = (++ia ==3 && ++ib == 3);

System.out.println("b3 = " + b3);

System.out.println("ia = " + ia);

System.out.println("ib = " + ib);

System.out.println("-------------------------------");

boolean b4 = (++ia ==5 || ++ib == 3);

System.out.println("b4 = " + b4);

System.out.println("ia = " + ia);

System.out.println("ib = " + ib);

在上述代码中,对于逻辑与运算,第一个条件为假后,跳过第二个条件的执行,所以ib的值没有变化;对于逻辑或运算,第一个条件为真后,跳过第二个条件的执行,所以ib的值依然是原来的值。

在 Java 编程中,短路逻辑运算符是一类特殊的逻辑运算符,它们在执行时具有短路特性。这意味着在计算逻辑表达式时,如果已经可以确定整个表达式的结果,则不会再继续计算剩余的部分。短路逻辑运算符的优先级低于关系运算符,高于赋值运算符。如果需要改变运算顺序,可以使用括号来明确指定。同时,短路逻辑运算符只能用于布尔类型的值。如果需要对其他类型的值进行逻辑判断,可以使用比较运算符将其转换为布尔类型的值。

在 Java 的“逻辑与”、“逻辑或”运算中,有短路和不短路运算的差别。Java 的短路“逻辑与”运算符是&&,短路“逻辑或”运算符是||;Java 的不短路“逻辑与”运算符是&,不短路“逻辑或”运算符是|。短路与在运算过程中,一旦左边为false就不再运算了;非短路与则是继续运算。同样,短路或和非短路或也是同样的道理。例如:

 

int x=0;

int y=0;

int z=0;

boolean a,b;

a=x>0 & y++>1;

System.out.println(a);

System.out.println("y="+y);

b=x>0&&z++>1;

System.out.println(b);

System.out.println("z="+z);

在这个代码中,定义了x,y,z三个变量,两个boolean类型的a与b同样进行逻辑运算x>0&y++>1,x>0&&z++>1,二者输出结果都是false,但前者y明显进行了运算,自身值+1,y的值变为 1,z的值没有变化。

短路与是 Java 语言中的一个逻辑运算符,记作&&。当A为false时,不去计算B的值而直接返回false;当A为true时,计算B的值。非短路与是 Java 语言中的一个逻辑运算符,记作&。当A为false时,继续计算B的值而不直接返回false。例如:

int a=10, b=20;

System.out.println("原始 a="+a);

System.out.println("原始 b="+b);

boolean bool;

if(a++==11 && b++==21) {

System.out.println("true");

System.out.println("a="+a);

System.out.println("b="+b);

} else {

System.out.println("false");

System.out.println("a="+a);

System.out.println("b="+b);

}

        输出结果:原始a=10原始b=20falsea=11b=20(注意这里,b的值并没有改变)。如果将代码中的短路与&&改为非短路与&,则输出结果为:原始a=10原始b=20falsea=11b=21(注意这里,b的值已经变化了)。短路或和非短路或的区别,可以自己去验证!!!

        逻辑运算符的短路特性对于逻辑与运算符来说,若第一个表达式为假则结果为假,此时跳过第二个表达式;对于逻辑或运算符来说,若第一个表达式为真则结果为真,此时跳过第二个表达式。例如:

 

int ia =3;

int ib =5;

// 对于逻辑与运算符来说,若第一个条件为假则整个表达式为假,此时跳过第二个表达式不执行

boolean b4= (++ia ==3) && (++ib ==5);

System.out.println("b4 = " + b4); //false

System.out.println(ia); //4

System.out.println(ib); //5 短路特性,第二个表达式跳过没执行了

// 对于逻辑或运算符来说,若第一个条件为真则整个表达式为真,此时跳过第二个表达式不执行

boolean b5= (++ia ==5) || (++ib ==5);

System.out.println("b5 = " + b5); //true

System.out.println(ia); //5

System.out.println(ib); //5 短路特性,第二个表达式跳过没执行了

案例:逻辑运算符判断三位数

        提示用户输入一个正整数,使用逻辑运算符判断该正整数是否为三位数,若是则打印true,否则打印false。逻辑运算符主要用于连接多个关系运算符作为最终运算的表达式,用于实现多条件的连接,关系运算符只能一种条件的判断,逻辑运算符实际上是关系运算符的升级。

 

import java.util.Scanner;

public class LogicJudgeTest {

public static void main(String[] args) {

//1、提示用户实现一个正整数并用变量记录

System.out.println("请输入一个正整数:");

Scanner sc = new Scanner(System.in);

int num = sc.nextInt();

//2、使用逻辑运算符判断是否为三位数并打印

System.out.println(num >=100&& num <=999);

}

}

七、位运算符

(一)基本用法

位运算符操作二进制数,包括按位与(&)、按位或(|)、按位异或(^)、按位取反(~)、左移(<<)、右移(>>)、无符号右移(>>>)。

  1. &(按位与):对两个整数的每一位执行逻辑与操作,只有当两个对应位都为1时,结果位才为1,否则为0。
  1. |(按位或):对两个整数的每一位执行逻辑或操作,只要两个对应位中有一个为1,结果位就为1,只有当两个对应位都为0时,结果位才为0。
  1. ^(按位异或):对两个整数的每一位执行逻辑异或操作,当两个对应位不同时,结果位为1,相同时为0。
  1. ~(按位取反):对一个整数的每一位执行逻辑取反操作,将0变为1,将1变为0。
  1. <<(左移):将一个整数的二进制表示向左移动指定的位数,右边用0填充。左移几位就相当于乘以2的几次幂。
  1. **(右移):将一个整数的二进制表示向右移动指定的位数,正数左边用0填充,负数左边用1填充。右移几位就相当于除以2的几次幂。
  1. ***(无符号右移):将一个整数的二进制表示向右移动指定的位数,无论最高位是0还是1,左边都用0填充。

(二)作用示例

  1. &:有0则0。例如,5(二进制为00000101)和4(二进制为00000100)进行按位与运算,结果为4(二进制为00000100),因为对应位中只要有一个为0,结果就为0。
  1. |:有1则1。例如,5(二进制为00000101)和4(二进制为00000100)进行按位或运算,结果为5(二进制为00000101),因为对应位中只要有一个为1,结果就为1。
  1. ^:相同为0,不同为1。例如,5(二进制为00000101)和4(二进制为00000100)进行按位异或运算,结果为1(二进制为00000001),因为对应位不同时结果为1,相同时为0。
  1. <<:左移几位就是乘以2的几次幂。例如,5(二进制为00000101)左移2位,结果为20(二进制为00010100),相当于5乘以2的2次方。
  1. **:右移几位就是除以2的几次幂。例如,5(二进制为00000101)右移1位,结果为2(二进制为00000010),相当于5除以2的1次方。
  1. ***:无符号右移,无论最高位是0还是1,左边都用0填充。例如,-5(二进制为11111011)无符号右移2位,结果为1073741820(二进制为00111111111111111111111111111100)。

八、条件运算符(三目运算符)

(一)格式及执行流程

格式:(关系表达式) ?表达式1:表达式2。先判断表达式,为 true 取表达式1,为 false 取表达式2。

        条件运算符也称为三目运算符,在 Java 编程中非常常见,它可以根据条件执行不同的操作,使代码更加简洁。

        条件运算符的格式为(关系表达式) ?表达式1:表达式2。其中,关系表达式是一个布尔表达式,当关系表达式为 true 时,整个表达式的结果为表达式1的值;当关系表达式为 false 时,整个表达式的结果为表达式2的值。

例如:int x,y,z;x = 6,y = 2;z = x>y? x-y : x+y;在这个例子中,首先判断 x>y 这个关系表达式,因为 6>2 为 true,所以 z 的值为 x-y,即 4。

条件运算符的执行流程如下:

  1. 先计算关系表达式的值。
  1. 如果关系表达式的值为 true,则返回表达式1的值。
  1. 如果关系表达式的值为 false,则返回表达式2的值。

条件运算符通常用于简化 if-else 语句,例如:

 

if(x > y){

max = x;

}else{

max = y;

}

        可以简化为:max = (x > y)? x : y;

        条件运算符还可以嵌套使用,以便根据多个条件执行不同的操作。例如:

        char grade ='B';

        double gpa =(grade =='A')?4.0:(grade =='B')?3.0:(grade =='C')?2.0:(grade =='D')?1.0:0.0;

        在上述示例中,如果学生的成绩为 B,则返回值为 3.0。

        需要注意的是,尽管条件运算符可以使代码更简洁,但它不应该被滥用。如果一个表达式变得过于复杂,使用 if-else 语句可能更易读。另外,条件运算符只能用于返回某个值。它不能被用于执行语句或控制流。

例如:

 

if(a%2==0)printf("even\n");

elseprintf("odd\n");

不能写成:(a%2==0)?printf("even\n"):printf("odd\n");

但可以用下面语句代替:printf("%s\n",(a%2==0?"even":"odd"));

该语句的作用是:若 a 为偶数,输出 even;若 a 为奇数,输出 odd。

九、结论

(一)总结 Java 运算符的重要性

        运算符是 Java 编程中不可或缺的部分,掌握各种运算符能够帮助开发者更加高效地编写代码。Java 中的运算符丰富多样,包括算术运算符、赋值运算符、比较运算符、逻辑运算符、位运算符和三元运算符等。这些运算符可以对数据进行各种操作,实现复杂的逻辑和计算。

        算术运算符用于基本的数学运算,如加、减、乘、除、取模等,还包括自增自减运算符,能够方便地对变量进行数值的增减操作。

        赋值运算符用于将值赋给变量,除了基本的赋值运算符外,还有复合赋值运算符,能够简化代码并提高编程效率。

        比较运算符用于比较两个值的大小关系或是否相等,其结果为布尔类型,常用于条件判断和循环控制。

        逻辑运算符用于进行逻辑判断,连接布尔类型的表达式或值,包括逻辑与、逻辑或、逻辑非、逻辑异或等,以及短路逻辑运算符,能够提高程序的执行效率。

        位运算符操作二进制数,包括按位与、按位或、按位异或、按位取反、左移、右移、无符号右移等,可用于对整数的二进制位进行操作,实现高效的位运算。

        三元运算符也叫三目运算符,用于取代某些简单的 if-then-else 语句,根据一个布尔表达式的结果来选择执行两个不同的语句,使代码更加简洁。

(二)对开发者的建议

        在编程过程中,根据实际需求合理选择和运用不同类型的运算符,注意运算符的优先级和结合性,避免出现错误。

        对于算术运算符,要注意数据类型的转换和运算规则,特别是整数除法和小数运算的精度问题。在使用自增自减运算符时,要清楚其前后位置的不同对变量值的影响。

        对于赋值运算符,要了解基本赋值运算符和扩展赋值运算符的特点和用法,注意扩展赋值运算符中隐含的强制类型转换可能带来的精度问题。

        对于关系运算符,要正确使用各种关系运算符进行比较,注意其返回值为布尔类型,以及在不同数据类型之间比较时可能出现的类型不匹配错误。在进行对象比较时,需谨慎使用“==”,因为它比较的是对象的引用地址而非内容,通常对于自定义类对象,应根据业务需求重写 equals 方法来进行内容的比较。

        对于逻辑运算符,要深入理解逻辑与、逻辑或、逻辑非以及短路逻辑运算符的运算规则和短路特性。合理运用短路特性可以提高程序的性能,例如在一些条件判断中,若通过短路与能提前确定整个表达式为假,则可避免执行后续不必要的复杂判断代码;同理,短路或在某些情况下也能减少不必要的运算。

        对于位运算符,由于其操作基于二进制数,开发者需熟悉二进制的表示和运算规则。在进行位运算时,要清楚不同位运算符的功能,如按位与可用于提取特定的二进制位,按位或可用于设置某些二进制位等。但位运算相对较为底层和复杂,使用时需谨慎考虑代码的可读性和可维护性,避免过度使用导致代码难以理解。

        对于条件运算符,要准确把握其语法格式和执行流程,它可以简洁地实现简单的条件判断和赋值操作,但对于复杂的逻辑,可能不如 if - else 语句清晰,所以需根据具体情况选择合适的条件判断方式。

        总之,开发者只有深入理解并熟练掌握 Java 基础运算符的方方面面,才能在编程实践中更加游刃有余地运用它们构建高效、准确且易于维护的代码。同时,不断积累经验,通过代码审查和学习优秀代码示例,进一步提升对运算符的运用水平,为 Java 编程项目的成功开发奠定坚实的基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2248274.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

iOS 17.4 Not Installed

0x00 系统警告 没有安装 17.4 的模拟器&#xff0c;任何操作都无法进行&#xff01; 点击 OK 去下载&#xff0c;完成之后&#xff0c;依旧是原样&#xff01; 0x01 解决办法 1、先去官网下载对应的模拟器&#xff1a; https://developer.apple.com/download/all/?q17.4 …

Flink细粒度的资源管理

Apache Flink致力于为所有应用程序自动导出合理的默认资源需求。对于希望根据其特定场景微调其资源消耗的用户,Flink提供了细粒度的资源管理。这里我们就来看下细粒度的资源管理如何使用。(注意该功能目前仅对DataStream API有用) 1. 适用场景 使用细粒度的资源管理的可能…

Ubuntu20.04运行msckf_vio

文章目录 环境配置修改编译项目运行MSCKF_VIO运行 Launch 文件运行 rviz播放 ROSBAG 数据集 运行结果修改mskcf 保存轨迹EVO轨迹评价EVO轨迹评估流程实操先把euroc的真值转换为tum&#xff0c;保存为data.tum正式评估 报错1问题描述 报错2问题描述问题分析问题解决 参考 环境配…

计算机网络 第4章 网络层

计算机网络 &#xff08;第八版&#xff09;谢希仁 第 4 章 网络层4.2.2 IP地址**无分类编址CIDR**IP地址的特点 4.2.3 IP地址与MAC地址4.2.4 ARP 地址解析协议4.2.5 IP数据报的格式题目2&#xff1a;IP数据报分片与重组题目&#xff1a;计算IP数据报的首部校验和(不正确未改) …

Angular面试题汇总系列一

1. 如何理解Angular Signal Angular Signals is a system that granularly tracks how and where your state is used throughout an application, allowing the framework to optimize rendering updates. 什么是信号 信号是一个值的包装器&#xff0c;可以在该值发生变化时…

SAR ADC系列15:基于Vcm-Base的开关切换策略

VCM-Based开关切换策略&#xff1a;采样~第一次比较 简单说明: 电容上下极板分别接Vcm&#xff08;一般Vcm1/2Vref&#xff09;。采样断开瞬间电荷锁定&#xff0c;进行第一次比较。 当VIP > VIN 时&#xff0c;同时 减小VIP 并 增大VIN 。P阵列最高权重电容从Vcm(1/2Vref)…

实现Excel文件和其他文件导出为压缩包,并导入

导出 后端&#xff1a; PostMapping("/exportExcelData")public void exportExcelData(HttpServletRequest request, HttpServletResponse response, RequestBody ResData resData) throws IOException {List<Long> menuIds resData.getMenuIds();List<Co…

某车企ASW面试笔试题

01--背景 去年由于工作岗位的动荡&#xff0c;于是面试了一家知名车企&#xff0c;上来进行了一番简单的介绍之后&#xff0c;被告知需要进入笔试环节&#xff0c;以往单位面试都是简单聊聊技术问题&#xff0c;比如对软件开发的流程或者使用的工具等待问题的交流&#xff0c;…

计算(a+b)/c的值

计算&#xff08;ab&#xff09;/c的值 C语言代码C语言代码Java语言代码Python语言代码 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 给定3个整数a、b、c&#xff0c;计算表达式(ab)/c的值&#xff0c;/是整除运算。 输入 输入仅一行&…

【在Linux世界中追寻伟大的One Piece】多线程(二)

目录 1 -> 分离线程 2 -> Linux线程互斥 2.1 -> 进程线程间的互斥相关背景概念 2.2 -> 互斥量mutex 2.3 -> 互斥量的接口 2.4 -> 互斥量实现原理探究 3 -> 可重入VS线程安全 3.1 -> 概念 3.2 -> 常见的线程不安全的情况 3.3 -> 常见的…

【NLP高频面题 - 分布式训练】ZeRO1、ZeRO2、ZeRO3分别做了哪些优化?

【NLP高频面题 - 分布式训练】ZeRO1、ZeRO2、ZeRO3分别做了哪些优化&#xff1f; 重要性&#xff1a;★★ NLP Github 项目&#xff1a; NLP 项目实践&#xff1a;fasterai/nlp-project-practice 介绍&#xff1a;该仓库围绕着 NLP 任务模型的设计、训练、优化、部署和应用&am…

AIGC--AIGC与人机协作:新的创作模式

AIGC与人机协作&#xff1a;新的创作模式 引言 人工智能生成内容&#xff08;AIGC&#xff09;正在以惊人的速度渗透到创作的各个领域。从生成文本、音乐、到图像和视频&#xff0c;AIGC使得创作过程变得更加快捷和高效。然而&#xff0c;AIGC并非完全取代了人类的创作角色&am…

C++11特性(详解)

目录 1.C11简介 2.列表初始化 3.声明 1.auto 2.decltype 3.nullptr 4.范围for循环 5.智能指针 6.STL的一些变化 7.右值引用和移动语义 1.左值引用和右值引用 2.左值引用和右值引用的比较 3.右值引用的使用场景和意义 4.右值引用引用左值及其一些更深入的使用场景分…

React中事件处理和合成事件:理解与使用

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

大数据新视界 -- 大数据大厂之 Hive 数据桶:优化聚合查询的有效手段(下)(10/ 30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

基于FPGA的信号DM编解码实现,包含testbench和matlab对比仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 1.编码器硬件结构 2.解码器硬件结构 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) FPGA测试结果如下&#xff1a; matlab对比仿真结果如下&#xff1a; 2.算法运行软…

鸿蒙中拍照上传与本地图片上传

1.首页ui import { picker } from kit.CoreFileKit; import fs from ohos.file.fs; import request from ohos.request; import { promptAction } from kit.ArkUI; import { cameraCapture } from ./utils/CameraUtils; import { common } from kit.AbilityKit; import { Imag…

【算法】连通块问题(C/C++)

目录 连通块问题 解决思路 步骤&#xff1a; 初始化&#xff1a; DFS函数&#xff1a; 复杂度分析 代码实现&#xff08;C&#xff09; 题目链接&#xff1a;2060. 奶牛选美 - AcWing题库 解题思路&#xff1a; AC代码&#xff1a; 题目链接&#xff1a;687. 扫雷 -…

人工智能 实验2 jupyter notebook平台 打印出分类器的正确率

实验2 jupyter notebook平台 【实验目的】掌握jupyter notebook平台的使用方法 【实验内容】上传文件到jupyter notebook平台&#xff0c;学会编辑运行ipynb文件 【实验要求】写明实验步骤&#xff0c;必要时补充截图 安装Anaconda。 2、 将BreadCancer.zip上传到jupyter no…

【贪心算法第五弹——300.最长递增子序列】

目录 1.题目解析 题目来源 测试用例 2.算法原理 3.实战代码 代码解析 注意本题还有一种动态规划的解决方法&#xff0c;贪心的方法就是从动态规划的方法总结而来&#xff0c;各位可以移步博主的另一篇博客先了解一下&#xff1a;动态规划-子序列问题——300.长递增子序列…