2.8.3 java关系运算符

关系运算的结果是布尔值:true/false;

运算符含义示例==等于a == b!=不等于 a != b>大于a > b<小于a < b>=大于或等于a >= b<=小于或等于a <= b

说明:
     = 是赋值运算符,而真正的判断两个操作数是否相等的元素安抚是==。
    ==、!= 是所有(基本和引用)数据类型都可以使用。
    > ,>=, <, <= 仅针对数值类型(byte/short/int/long/float/double/char)

2.8.4 java逻辑运算符

逻辑运算的操作数和运算结果都是boolean值。

运算符说明逻辑与&(与)两个操作数都为true时,结果才为true,否则是false逻辑或|(或)两个操作数有一个是true,结果就为true短路与&&(与)只要有一个为false,则结果为false短路或||(或)只要有一个为true,则结果为true逻辑非!(非)取反: !false为true, !true为false<、td> 逻辑异或^(异或)相同为false,不同为true

短路与和短路或采用短路的方式。从左到右计算,如果只通过运算符左边的操作数就能够确定该逻辑表达式的值,则不会继续计算运算符右边的操作数,提高效率。

【示例一】短路与和逻辑与

//1>2的结果为false,那么整个表达式的结果即为false,将不再计算2>(3/0)
boolean c = 1>2 && 2>(3/0);
System.out.println(c);
//1>2的结果为false,那么整个表达式的结果即为false,还要计算2>(3/0),0不能做除数,//会输出异常信息
boolean d = 1>2 & 2>(3/0);
System.out.println(d);

【示例二】短路与和逻辑与

public static void main(String[] args){
        boolean b = true;
        boolean b2 = false;
        //逻辑与  左边为false,但还要计算右边
//      System.out.println(b2 & 1<(1/0));//false
        //短路与 左边为false 右边不在计算
        System.out.println(b2 && 1<(1/0));//false
        //逻辑或
        System.out.println(b2 | b);//true;
        //短路或
        System.out.println(b2 || b);//true
        //逻辑异或
        System.out.println(b2 ^ b);//true
        //逻辑非
        System.out.println(!b2);//取反 true

        System.out.println(3&4);//0
    }

2.8.5 java 位运算

位运算指的是进行二进制位的运算

位运算符说明~取反&按位与|按位或^按位异或<<左移运算符,左移1位相当于乘2>>右移运算符,右移1位相当于除2取商

【示例】左移运算和右移运算

int a = 3*2*2;
int b = 3<<2; //相当于:3*2*2;
int c = 12/2/2;
int d = 12>>2; //相当于12/2/2;

1. &和|既是逻辑运算符,也是位运算符。如果两侧操作数都是boolean类型,就作为逻辑运算符。如果两侧的操作数是整数类型,就是位运算符。
2. 不要把“^”当做数学运算“乘方”,是“位的异或”操作。

2.8.6 java 字符串连接符

+”运算符两侧的操作数中只要有一个是字符串(String)类型,系统会自动将另一个操作数转换为字符串然后再进行连接。

【示例】连接符“+”

System.out.println(4 + 3+ "3");//73
System.out.println("3"+ 4 + 3);//343

2.8.7 java条件运算符(三目运算符)

语法格式:

x ? y : z;

其中 x 为 boolean 类型表达式,先计算 x 的值,若为true,则整个运算的结果为表达式 y 的值,否则整个运算结果为表达式 z 的值。

【示例】三目条件运算符

int score = 80; 
    int x = -100;
    String type =score<60?"不及格":"及格"; 
    int flag = x > 0 ? 1 : (x == 0 ? 0 : -1);
    System.out.println("type= " + type);
    System.out.println("flag= "+ flag);

运行结果:
 type = 及格;
     flag = -1;

2.9.1java 自动类型转换

自动类型转换指的是容量小的数据类型可以自动转换为容量大的数据类型。如图2-6所示,黑色的实线表示无数据丢失的自动类型转换,而虚线表示在转换时可能会有精度的损失。

A在java是什么意思_c++ 位运算


可以将整型常量直接赋值给byte、 short、 char等类型变量,而不需要进行强制类型转换,只要不超出其表数范围即可。

【示例一】自动类型转换特例

short  b = 12;  //合法
short  b = 1234567;//非法,1234567超出了short的表数范围


【示例二】自动类型转换


public static void show(){
    byte a = 12;
    //自动类型转换 byte --> short
    short s = a;
    int i = 334;
    char c = 'a';
    //自动类型转换 char-->int
    int a1 = c;
    int i2 = 1313;
    //自动类型转换 int -->long
    long l1 = i2;
    //自动类型转换 float --> double
    float f1 = 3.234f;
    double d1 = f1;

}


2.9.2 java强制类型转换

强制类型转换,又被称为造型,用于显式的转换一个数值的类型。在有可能丢失信息的情况下进行的转换是通过造型来完成的,但可能造成精度降低或溢出。

【示例2】强制类型转换


double x  = 3.14; 
int nx = (int)x;   //值为3
char c = 'a';
int d = c+1;
System.out.println(nx);//3
System.out.println(d);//97+1 = 98
System.out.println((char)d);//b


当将一种类型强制转换成另一种类型,而又超出了目标类型的表数范围,就会被截断成为一个完全不同的值。

【示例】强制类型转换特例


int x = 300;
byte bx = (byte)x;    //值为44

byte的标识范围(-128~127)超出的部分从范围的最左边开始算起知道第44位为300


注意: 不能在布尔类型和任何数值类型之间做强制类型转换