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

(一)研究背景

在 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.rhkb.cn/news/478956.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【微服务】 Eureka和Ribbon

一、Eureka 服务调用出现的问题&#xff1a;在远程调用另一个服务时&#xff0c;我们采用的解决办法是发送一次http请求&#xff0c;每次环境的变更会产生新的地址&#xff0c;所以采用硬编码会出现很多麻烦&#xff0c;并且为了应对并发问题&#xff0c;采用分布式部署&#…

计算机毕业设计Python+大模型美食推荐系统 美食可视化 美食数据分析大屏 美食爬虫 美团爬虫 机器学习 大数据毕业设计 Django Vue.js

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

QT QToolButton控件 全面详解

本系列文章全面的介绍了QT中的57种控件的使用方法以及示例,包括 Button(PushButton、toolButton、radioButton、checkBox、commandLinkButton、buttonBox)、Layouts(verticalLayout、horizontalLayout、gridLayout、formLayout)、Spacers(verticalSpacer、horizontalSpacer)、…

[SWPUCTF 2021 新生赛]error

[SWPUCTF 2021 新生赛]error 报错注入&#xff1a;?idand updatexml(1,concat(0x7e,database(),0x7e),1) -- 爆出了数据库名称 test_db 爆表名&#xff1a;?idand updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_sc…

快速理解微服务中Gateway的概念

一.基本概念 定义&#xff1a; 在微服务架构中&#xff0c;Spring Cloud Gateway 是一个用于API网关的框架&#xff0c;它是一个基于 Spring Framework 的高效、可扩展的路由器和反向代理&#xff0c;它能够将外部请求转发到适当的微服务&#xff0c;并提供一些与请求处理相关…

【消息序列】详解(7):剖析回环模式--设备测试的核心利器

目录 一、概述 1.1. 本地回环模式 1.2. 远程环回模式 二、本地回环模式&#xff08;Local Loopback mode&#xff09; 2.1. 步骤 1&#xff1a;主机进入本地环回模式 2.2. 本地回环测试 2.2.1. 步骤 2a&#xff1a;主机发送HCI数据包并接收环回数据 2.2.2. 步骤 2b&…

GCP Dataproc有什么特点,有什么最佳实践

Google Cloud Dataproc 是一个完全托管的 Apache Hadoop 和 Apache Spark 服务&#xff0c;旨在快速处理大数据工作负载。以下是 Dataproc 的一些主要特点和最佳实践&#xff1a; 特点 托管服务&#xff1a;Dataproc 是一个完全托管的服务&#xff0c;用户无需管理基础设施&…

sunshine和moonlight串流网络丢失帧高的问题(局域网)

注&#xff1a;此贴结果仅供参考 场景环境&#xff1a;单身公寓 路由器&#xff1a;2016年的路由器 开始&#xff1a;电脑安装sunshine软件&#xff0c;手机安装moonlight软件开始串流发现网络丢失帧发现巨高 一开始怀疑就是路由器问题&#xff0c;因为是局域网&#xff0c;而…

STL容器1

STL容器1 1.1 vector1.2 set1.3 map 1.1 vector vector的优点&#xff1a; 1.动态大小调整‌&#xff1a;vector可以根据需要动态地调整大小&#xff0c;自动分配和释放内存&#xff0c;确保在添加或删除元素时实现高效的内存管理‌ 2.连续存储‌&#xff1a;vector的元素在内存…

第六届国际科技创新学术交流大会暨新能源科学与电力工程国际(NESEE 2024)

重要信息 会议官网&#xff1a;nesee.iaecst.org 会议时间&#xff1a;2024年12月6-8日 会议地点&#xff1a; 中国-广州&#xff08;越秀国际会议中心) 大会简介 新能源科学与电力工程国际学术会议&#xff08;NESEE 2024&#xff09;作为第六届国际科技创新学术交流大会分…

RL78/G15 Fast Prototyping Board Arduino IDE 平台开发过程

这是一篇基于RL78/G15 Fast Prototyping Board的Arduino IDE开发记录 RL78/G15 Fast Prototyping Board硬件简介&#xff08;背景&#xff09;基础测试&#xff08;方法说明/操作说明&#xff09;开发环境搭建&#xff08;方法说明/操作说明代码结果&#xff09;Arduino IDE RL…

visionpro实践项目(一)

1.需求&#xff1a;测量零件的宽度。 2.解决思路&#xff1a;使用模板匹配工具先匹配到零件&#xff0c;使用卡尺工具测量宽度&#xff0c;使用标签工具显示宽度信息。 3.步骤&#xff1a; 导入CogPMAlignTool工具&#xff0c;训练模板&#xff0c;实现模板匹配功能。 导入卡…

Scala习题

姓名&#xff0c;语文&#xff0c;数学&#xff0c;英语 张伟&#xff0c;87&#xff0c;92&#xff0c;88 李娜&#xff0c;90&#xff0c;85&#xff0c;95 王强&#xff0c;78&#xff0c;90&#xff0c;82 赵敏&#xff0c;92&#xff0c;88&#xff0c;91 孙涛&#xff0c…

mvn-mac操作小记

1.安装brew 如果报错&#xff0c;Warning: /opt/homebrew/bin is not in your PATH. vim ~/.zshrc&#xff0c;最后一行追加 export PATH“/opt/homebrew/bin:$PATH” source ~/.zshrc 2.安装brew install maven mvn -version查看路径 Maven home: /opt/homebrew/Cellar/mav…

银河麒麟桌面系统——桌面鼠标变成x,窗口无关闭按钮的解决办法

银河麒麟桌面系统——桌面鼠标变成x&#xff0c;窗口无关闭按钮的解决办法 1、支持环境2、详细操作说明步骤1&#xff1a;用root账户登录电脑步骤2&#xff1a;导航到kylin-wm-chooser目录步骤3&#xff1a;编辑default.conf文件步骤4&#xff1a;重启电脑 3、结语 &#x1f49…

路由器中继与桥接

一 . 背景 现在的路由器大多数已经开始支持多种网络连接模式&#xff0c;以下将以TP-Link迷你无线路由器为例进行展开介绍。在TP-Link迷你无线路由器上一般有AP&#xff08;接入点&#xff09;模式&#xff0c;Router&#xff08;无线路由&#xff09;模式&#xff0c;Repeate…

基于springboot的县市级土地使用监控系统的设计与实现

文末获取本系统&#xff08;程序源码数据库调试部署开发环境&#xff09;文末可获取&#xff0c;系统界面在最后面。 摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的…

Java【多线程】(1)进程与线程

目录 1.前言 2.正文 2.1什么是进程 2.2PCB&#xff08;进程控制块&#xff09; 2.2.1进程id 2.2.2内存指针 2.2.3文件描述符表 2.2.4进程状态 2.2.4.1就绪状态 2.2.4.2阻塞状态 2.2.5进程优先级 2.2.6进程上下文 2.2.7进程的记账信息 2.3CPU操作进程的方法 2.4什…

.net的winfrom程序 窗体透明打开窗体时出现在屏幕右上角

窗体透明&#xff0c; 将Form的属性Opacity&#xff0c;由默认的100% 调整到 80%&#xff0c;这个数字越小越透明(尽量别低于50%&#xff0c;不信你试试看)&#xff01; 打开窗体时出现在屏幕右上角 //构造函数 public frmCalendarList() {InitializeComponent();//打开窗体&…

金融租赁系统助力企业升级与风险管理的新篇章

内容概要 在当今的商业环境中&#xff0c;“金融租赁系统”可谓是企业成功的秘密武器。简单来说&#xff0c;这个系统就像一位聪明的财务顾问&#xff0c;帮助企业在资金和资源的运用上达到最优化。从设备采购到项目融资&#xff0c;它提供了一种灵活的方式&#xff0c;让企业…