Java提供了许多类型的操作符,可以根据需要使用它们。它们根据其提供的功能进行分类。其中一些类型包括:
让我们详细看一下。
1.算术运算符: 它们用于对基本数据类型执行简单的算术运算。
- * : 乘法
- / : 分开
- % : 模
- + : 附加
- – : 扣除
2.一元运算符: 一元运算符只需要一个操作数。它们用于增加、减少或抵消一个值。
- – : 一元负号 ,用于对值求反。
- + : 一元加号 指示正值(但是,如果没有该值,则数字为正值)。当操作数的类型为字节、字符或短字符时,它会自动转换为int。这被称为一元数字提升。
- ++ : 增量运算符 ,用于将值递增1。增量运算符有两种。
- 增薪后: 值首先用于计算结果,然后递增。
- 增量前: 值先递增,然后计算结果。
- -:减量运算符 ,用于将值递减1。减量运算符有两种。
- 减量后: 值首先用于计算结果,然后递减。
- 预减量: 值先递减,然后计算结果。
- ! : 逻辑not运算符 ,用于反转布尔值。
3.赋值运算符:’=’ 赋值运算符用于为任何变量赋值。它具有从右到左的关联性,即运算符右侧给定的值被分配给左侧的变量,因此在使用它之前必须声明右侧值,或者应该是常量。
赋值运算符的一般格式为:
variable = value;
在许多情况下,赋值运算符可以与其他运算符组合,以生成名为 复合语句 .例如,而不是 = a+5,我们可以写一个 += 5.
- += ,用于将左操作数与右操作数相加,然后将其赋给左侧的变量。
- -= ,用于从左操作数中减去右操作数,然后将其赋给左边的变量。
- *= ,用于将左操作数与右操作数相乘,然后将其赋给左侧的变量。
- /= ,用于将左操作数除以右操作数,然后将其赋给左侧的变量。
- %= ,用于按右操作数分配左操作数的模,然后将其分配给左侧的变量。
4.关系运算符: 这些运算符用于检查等式、大于、小于等关系。它们在比较后返回布尔结果,广泛用于循环语句以及条件if-else语句。一般的格式是,
variable relation_operator value
- 一些关系运算符是-
- ==,等于: 如果左侧等于右侧,则返回true。
- !=, 不等于: 如果左侧与右侧不相等,则返回true。
- 如果左侧小于右侧,则返回true。
- <=,小于或等于 如果左侧小于或等于右侧,则返回true。
- >,大于: 如果左侧大于右侧,则返回true。
- >=,大于或等于: 如果左侧大于或等于右侧,则返回true。
5.逻辑运算符: 这些运算符用于执行“逻辑与”和“逻辑或”操作,即与数字电子中的“与门”和“或门”类似的功能。需要记住的一点是,如果第一个条件为假,即具有短路效应,则不评估第二个条件。广泛用于测试做出决定的几种条件。
条件运算符包括:
- &&,逻辑和: 当两个条件都为真时,返回真。
- ||,逻辑或: 如果至少有一个条件为真,则返回真。
- 三元运算符: 三元运算符是if-else语句的简写版本。它有三个操作数,因此得名三元。
一般格式为:
condition ? if true : if false
上面的语句意味着,如果条件的计算结果为true,则执行“?”后面的语句否则执行“:.”后面的语句
JAVA
// Java program to illustrate // max of three numbers using // ternary operator. public class operators { public static void main(String[] args) { int a = 20 , b = 10 , c = 30 , result; // result holds max of three // numbers result = ((a > b) ? (a > c) ? a : c : (b > c) ? b : c); System.out.println( "Max of three numbers = " + result); } } |
Max of three numbers = 30
6.位运算符: 这些运算符用于对数字的各个位进行操作。它们可以与任何整数类型一起使用。它们用于执行二进制索引树的更新和查询操作。
- &,按位AND运算符: 逐位返回输入值的大小。
- |,按位OR运算符: 逐位返回或返回输入值。
- ^,按位异或运算符: 返回输入值的逐位异或。
- ~,位补运算符: 这是一个一元运算符,返回输入值的补码表示形式,即所有位都反转。
7.值班人员: 这些运算符用于将数字的位向左或向右移位,从而将数字分别乘以或除以2。当我们必须将一个数字乘以或除以二时,可以使用它们。通用格式-
number shift_op number_of_places_to_shift;
- < 将数字的位向左移动,并在左侧的空白处填充0。类似于将数字乘以二的幂的效果。
- >>,署名右班操作员: 将数字的位向右移动,并在左侧的空白处填充0。最左边的位取决于初始数字的符号。类似于用二的幂除数字的效果。
- >>>,无符号右移运算符: 将数字的位向右移动,并在左侧的空白处填充0。最左边的位设置为0。
8.运算符实例: 运算符的实例用于类型检查。它可以用来测试对象是类、子类还是接口的实例。通用格式-
object instance of class/subclass/interface
JAVA
// Java program to illustrate // instance of operator class operators { public static void main(String[] args) { Person obj1 = new Person(); Person obj2 = new Boy(); // As obj is of type person, it is not an // instance of Boy or interface System.out.println( "obj1 instanceof Person: " + (obj1 instanceof Person)); System.out.println( "obj1 instanceof Boy: " + (obj1 instanceof Boy)); System.out.println( "obj1 instanceof MyInterface: " + (obj1 instanceof MyInterface)); // Since obj2 is of type boy, // whose parent class is person // and it implements the interface Myinterface // it is instance of all of these classes System.out.println( "obj2 instanceof Person: " + (obj2 instanceof Person)); System.out.println( "obj2 instanceof Boy: " + (obj2 instanceof Boy)); System.out.println( "obj2 instanceof MyInterface: " + (obj2 instanceof MyInterface)); } } class Person { } class Boy extends Person implements MyInterface { } interface MyInterface { } |
obj1 instanceof Person: trueobj1 instanceof Boy: falseobj1 instanceof MyInterface: falseobj2 instanceof Person: trueobj2 instanceof Boy: trueobj2 instanceof MyInterface: true
算子的优先性和结合性
在处理涉及多种运算符的混合方程时,会使用优先级和关联规则。在这种情况下,这些规则首先确定要考虑的方程的哪一部分,因为对于同一方程可以有许多不同的估值。下表以数量级的降序描述运算符的优先级,顶部表示最高优先级,底部表示最低优先级。
关于运算符的有趣问题
1.优先级和关联性: 当涉及到混合方程时,通常会出现混淆,即具有多个算子的方程。问题是先解决哪一部分。在这些情况下,有一条黄金法则可以遵循。如果运算符的优先级不同,请先求解优先级较高的运算符。如果它们具有相同的优先级,则根据关联性进行求解,即从右向左或从左向右。以下程序的解释在程序本身的注释中写得很好。
JAVA
public class operators { public static void main(String[] args) { int a = 20 , b = 10 , c = 0 , d = 20 , e = 40 , f = 30 ; // precedence rules for arithmetic operators. // (* = / = %) > (+ = -) // prints a+(b/d) System.out.println( "a+b/d = " + (a + b / d)); // if same precendence then associative // rules are followed. // e/f -> b*d -> a+(b*d) -> a+(b*d)-(e/f) System.out.println( "a+b*d-e/f = " + (a + b * d - e / f)); } } |
a+b/d = 20a+b*d-e/f = 219
2.成为一名编译器: 我们系统中的编译器在生成令牌时使用lex工具来匹配最大匹配。如果忽视了这一点,就会产生一些问题。例如,考虑语句 a=b++c ; 如果读者太多,这可能会导致编译器错误。但是这个语句是绝对正确的,因为lex创建的标记是a,=,b,+,+,c。因此,这个语句具有类似的效果,首先将b+c赋值给a,然后增加b。同样地,a=b+c;将生成错误,因为生成的标记是a、=、b、++、++、+、c。这实际上是一个错误,因为在第二个一元操作数之后没有操作数。
JAVA
public class operators { public static void main(String[] args) { int a = 20 , b = 10 , c = 0 ; // a=b+++c is compiled as // b++ +c // a=b+c then b=b+1 a = b++ + c; System.out.println( "Value of a(b+c), " + " b(b+1), c = " + a + ", " + b + ", " + c); // a=b+++++c is compiled as // b++ ++ +c // which gives error. // a=b+++++c; // System.out.println(b+++++c); } } |
Value of a(b+c), b(b+1), c = 10, 11, 0
3.使用+over(): 在内部使用+运算符时 系统出来println() 确保使用括号进行加法。如果我们在做加法之前写一些东西,那么字符串加法就发生了,也就是说,加法的关联性是从左到右的,因此整数被添加到一个字符串中,首先生成一个字符串,当使用+,字符串对象就会连接起来。因此,它可能会产生不想要的结果。
JAVA
public class operators { public static void main(String[] args) { int x = 5 , y = 8 ; // concatenates x and y as // first x is added to "concatenation (x+y) = " // producing "concatenation (x+y) = 5" // and then 8 is further concatenated. System.out.println( "Concatenation (x+y)= " + x + y); // addition of x and y System.out.println( "Addition (x+y) = " + (x + y)); } } |
Concatenation (x+y)= 58Addition (x+y) = 13
本文由 Rishabh Mahrsee .如果你喜欢GeekSforgek,并想贡献自己的力量,你也可以使用 写极客。组织 或者把你的文章寄去评论-team@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写评论。