Java(六)运算符和表达式

本文详细介绍了Java中的各类运算符,包括算术运算符、关系运算符、布尔逻辑运算符、位运算符等,并通过示例代码展示了它们的具体应用。

第二章 Java的数据类型


    ======================================
    ===>>>   第三章  Java的运算符和表达式   <<<===
    ======================================

    §3-1 运算符

    一、对于C/C++来说,Java中的运算符号并没有做多大改动,在称谓上面,由C/C++里面的“目”改成

了“元”。比如说:在C++里面叫做“三目运算符”的?:,在Java里面叫做“三元运算符”。

    同样,Java是允许进行自加(i++或者++i)和自减(j--或者--j)运算的。

    二、Java的运算符归纳如下:

    1、算术运算符 ( + 、- 、* 、/ 、% 、++ 、-- )

    2、关系运算符 ( > 、< 、>= 、<= 、== 、!= )

    3、布尔逻辑运算符 ( ! 、&& 、|| )

    4、位运算符 ( >> 、<<、>>> 、& 、| 、^ 、~ )

    5、赋值运算符 ( = 、及其扩展赋值运算符如:+= )

    6、条件运算符 ( ?: )

    7、其它(包括分量运算符·,下标运算符[],实例运算符instance of,内存分配运算符new,强制

类型转换运算符(类型),方法调用运算符()等)


    §3-2 算术运算符

    一、一元算术运算符

运算符     用法     描述

  +        +op      正值

  -        -op      负值

  ++    ++op,op++    加1

  --    --op,op--    减1

    二、二元算术运算符

运算符     用法     描述

  +      op1+op2     加

  -      op1-op2     减

  *      op1*op2     乘

  /      op1/op2     除

  %      op1%op2  取模(求余)

    Java对加运算符进行了扩展,使它能够进行字符串的连接,如"abc"+"de",得到串"abcde"。

    与C/C++不同,对取模运算符%来说,其操作数可以为浮点数37.2%10=7.2。

    下面的例子说明了算术运算符的使用:

public class ArithmaticOp
{
      public static void main( String args[] )
      {
            int a=5+4;     //a=9
            int b=a*2;     //b=18
            int c=b/4;     //c=4
            int d=b-c;     //d=14
            int e=-d;      //e=-14
            int f=e%4;     //f=-2
            double g=18.4;
            double h=g%4;  //h=2.4
            int i=3;
            int j=i++;     //i=4,j=3
            int k=++i;     //i=5,k=5
            System.out.println("a = "+a);
            System.out.println("b = "+b);
            System.out.println("c = "+c);
            System.out.println("d = "+d);
            System.out.println("e = "+e);
            System.out.println("f = "+f);
            System.out.println("g = "+g);
            System.out.println("h = "+h);
            System.out.println("i = "+i);
            System.out.println("j = "+j);
            System.out.println("k = "+k);
      }
}

    其结果为:

C:/>java ArithmaticOp

a = 9

b = 18

c = 4

d = 14

e = -14

f = -2

g = 18.4

h = 2.4

i = 5

j = 3

k = 5

 

    § 3-3 关系运算符

运算符     用法     返回true的情况

  >     op1>op2     op1大于op2

  >+    op1>=op2    op1大于或等于op2

  <     op1<op2     op1小于op2

  <=    op1<=op2    op1小于或等于op2

  ==     op1==op2     op1与op2相等

  !=     op1!=op2     op1与op2不等

    和C/C++相比,Java中的何数据类型的数据(包括基本类型和组合类型)都可以通过“==”或“!=”

来比较是否相等。

    关系运算的结果返回true或false,而不是C/C++中的1或0。

    关系运算符常与布尔逻辑运算符一起使用,作为流控制语句的判断条件。如:if( a>b && b==c)

 

    § 3-4 布尔逻辑运算符

 op1     op2     op1&&op2     op1||op2     !op1

false   false     false        false       true

false   true      false        true        true

true    false     false        true        false

true    true      true         true        false

    ·&&、‖为二元运算符,实现逻辑与、逻辑或。

    ·!为一元运算符,实现逻辑非。

    ·对于布尔逻辑运算,先求出运算符左边的表达式的值,对或运算如果为true,则整个表达式的结果为true,不必对运算符右边的表达式再进行运算;同样,对与运算,如果左边表达式的值为false,则不必对右边的表达式求值,整个表达式的结果为false。

    下面的例子说明了关系运算符和布尔逻辑运算符的使用。

public class RelationAndConditionOp{

     public static void main( String args[] ){

          int a=25,b=3;

          boolean d=a<b;      //d=false

          System.out.println("a<b = "+d);

          int e=3;

          if(e!=0 && a/e>5)

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

          int f=0;

          if(f!=0 && a/f>5)

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

          else

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

     }

}

    其运行结果为:

C:/>java RelationAndConditionOp

a<b = false

a/e = 8

f = 0

    注意:上例中,第二个if语句在运行时不会发生除0溢出的错,因为e!=0为false,所以就不需要对a/e进行运算。

 

    § 3-5 位运算符

    位运算符用来对二进制位进行操作,Java中提供了如下的位运算符:

    位运算符中,除“~”以 外,其余均为二元运算符。

    操作数只能为整型和字符型数据。

    3-4-1 补码

    Java使用补码来表示二进制数,在补码表示中,最高位为符号位,正数的符号位为0,负数为1。补码

的规定如下:

    对正数来说,最高位为0,其余各位代表数值本身(以二进制提示),如+42的补码为00101010。

    对负数而言,把该数绝对值的补码按位取反,然后对整个数

    1、即得该数的补码。如:

    -42的补码为11010110(00101010按位取反11010101 +1 11010110 )

    用补码来表示数,0的补码是唯一的,都 为00000000。(而在原码,反码表示中,+0和-0的表示是不

唯一的,可参见相应的书籍)而且可以用111111表示-1的补码)这也是补码与原码和反码的区别)。

    3-4-2 按位取反运算符 ~

    ~ 是一元运算法,对数据的每个二进制位取反,即把1变为0,把0变为1。

    例如 :

0010101 
~ 
1101010

    注意,运算符与-运算符不同,~21≠-21。

    3-4-3 按位与运算符&

    参与运算的两个值,如果两个相应位都为1,则该位的结果为1,例如:

0010101 
~ 
1101010

    注意,~运算符与-运算符不同,~21≠-21。

    3-4-3  按位与运算符&

    参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0。即:

    0 & 0 = 0 ;0 & 1 = 0 ;1 & 0 = 0 ;1 & 1 = 1 ;


第四章 Java的流控制

<think>嗯,用户之前已经询问过Java的数据类型,现在又问运算符表达式,看来是在系统地学习Java基础。我需要确保内容连贯,同时不要重复之前的信息。数据类型运算符都是基础中的重点,用户可能正在准备面试或者刚入门,需要清晰的结构实际例子来帮助理解。 首先,要明确运算符的分类,Java运算符有很多种,比如算术、关系、逻辑、位运算等等。得按照逻辑顺序介绍,从简单到复杂。然后表达式部分,需要解释清楚表达式的组成类型转换的问题,特别是自动类型提升强制转换,这些容易出错的地方需要强调。 用户之前的数据类型回答中提到了内存优化精度问题,这里在讲解运算符时,可以关联到这些点,比如整型运算浮点运算的效率差异,或者位运算在内存优化中的应用。同时,要注意运算符的优先级,这是编写正确表达式的基础,可能需要用表格来清晰展示。 还要考虑用户可能的误区,比如逻辑运算符的短路特性,或者自增自减运算符的前后区别,这些都需要用例子说明。此外,三元运算符复合赋运算符的实际应用场景,能帮助用户理解何时使用它们更合适。 需要避免使用过于专业的术语,保持口语化,但又要准确。例如,解释位运算时,可以提到其在底层开发或性能敏感场景中的应用,而不仅仅是理论上的讲解。同时,结合用户之前的数据类型知识,比如char类型的Unicode编码与位运算的关系,可以加深理解。 最后,检查是否有遗漏的重要运算符,比如instanceof或赋运算符,确保覆盖全面。总结部分要强调运算符的正确使用对代码效率可读性的影响,呼应之前数据类型的最佳实践,帮助用户形成完整的知识体系。</think>Java运算符表达式是程序逻辑实现的核心工具,通过系统分类实际案例解析,帮您快速掌握其精髓: --- ### 一、运算符分类体系 #### 1. 算术运算符 - **基础运算** `+`(加)、`-`(减)、`*`(乘)、`/`(除)、`%`(取模) *特殊现象*:整数除法截断 ```java int x = 5 / 2; // 结果为2(非2.5) double y = 5 / 2; // 仍为2.0(自动类型提升前已计算) ``` - **自增/自减** ```java int a = 5; int b = a++; // 后置:b=5, a=6 int c = ++a; // 前置:a=7, c=7 ``` #### 2. 关系运算符 `>`、`<`、`>=`、`<=`、`==`、`!=` *注意浮点数比较误差*: ```java double d1 = 0.1 + 0.2; double d2 = 0.3; System.out.println(d1 == d2); // false(应使用Math.abs(d1-d2) < 1e-6) ``` #### 3. 逻辑运算符 - **标准逻辑** `&&`(短路与)、`||`(短路或)、`!`(非) *短路特性示例*: ```java if (obj != null && obj.isValid()) { // 避免空指针异常 } ``` - **非短路版本** `&`(按位与)、`|`(按位或) *强制全运算*: ```java boolean b = (x > 5) | (y++ < 3); // y自增必然执行 ``` #### 4. 位运算符(内存级操作) - **基础位操作** `&`(AND)、`|`(OR)、`^`(XOR)、`~`(取反) *应用场景*:权限控制、加密算法、图像处理 ```java int FLAG_A = 1 << 0; // 0001 int FLAG_B = 1 << 1; // 0010 int flags = FLAG_A | FLAG_B; // 0011 ``` - **位移运算** `<<`(左移)、`>>`(带符号右移)、`>>>`(无符号右移) *性能优化实例*: ```java int x = 16; x = x << 2; // 64(等效于x * 4) x = x >> 1; // 32(带符号保持正负) ``` #### 5. 赋运算符 - **复合赋** `+=`、`-=`、`*=`、`/=`、`%=` *隐式类型转换风险*: ```java byte b = 10; b += 5; // 合法(等效于b = (byte)(b + 5)) b = b + 5; // 编译错误(需要强制转换) ``` #### 6. 其他关键运算符 - **三元运算符** `条件 ? 表达式1 : 表达式2` *嵌套使用示例*: ```java String result = score > 90 ? "A" : score > 80 ? "B" : "C"; ``` - **类型判断** `instanceof` ```java Object obj = "hello"; if (obj instanceof String) { String s = (String) obj; // 安全转换 } ``` --- ### 二、表达式核心机制 #### 1. 类型提升规则 - **自动类型提升** | 操作数类型 | 提升方向 | |------------|----------| | `byte` | → int | | `short` | → int | | `char` | → int | | `int`+`long` | → long | | 整数+浮点 | → 浮点 | *示例*: ```java double d = 5 + 3.14; // int自动转double ``` #### 2. 强制类型转换 ```java int x = (int) 3.99; // 结果为3(截断非四舍五入) char c = (char) 65; // 'A' ``` #### 3. 运算符优先级(从高到低) | 优先级 | 运算符 | |--------|----------------------------------| | 1 | `()`、`[]`、`.`(方法访问) | | 2 | `!`、`~`、`++`、`--`(单目) | | 3 | `*`、`/`、`%` | | 4 | `+`、`-` | | 5 | `<<`、`>>`、`>>>` | | 6 | `<`、`<=`、`>`、`>=`、`instanceof` | | 7 | `==`、`!=` | | 8 | `&` | | 9 | `^` | | 10 | `|` | | 11 | `&&` | | 12 | `||` | | 13 | `?:`(三元) | | 14 | `=`及其复合形式 | *易错案例*: ```java int x = 5 + 3 * 2; // 11(而非16) boolean b = true || false && false; // true(&&优先级更高) ``` --- ### 三、实战技巧 #### 1. 位运算优化 ```java // 判断奇偶(比%运算快5倍) if ((x & 1) == 0) { /* 偶数 */ } // 交换变量(无临时变量) a ^= b; b ^= a; a ^= b; ``` #### 2. 表达式短路应用 ```java // 防御式编程 if (file != null && file.exists()) { // 安全操作文件 } ``` #### 3. 复合赋陷阱 ```java int i = 5; i *= 2 + 3; // 等效于i = i * (2+3)=25(不是i=i*2+3=13) ``` --- ### 四、常见错误规避 1. **整数溢出** ```java int max = Integer.MAX_VALUE; int overflow = max + 1; // -2147483648 ``` 2. **浮点精度丢失** ```java System.out.println(0.1 + 0.2 == 0.3); // false ``` 3. **空指针隐患** ```java Integer num = null; int x = num; // 运行时异常(拆箱导致) ``` --- 掌握运算符特性与表达式规则,能显著提升代码质量运行效率。建议通过实际编码练习加深理解,特别注意类型转换运算优先级带来的隐性影响。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值