08_运算符

运算符

一. 算数运算符

概念:两个操作数进行计算

  • +-*/%

一元运算符:只有一个操作数

  • ++,--

前++:先++,再赋值

后++:先赋值,再++

public class TestOperation1{
	
	public static void main(String[] args){
		int a = 10;		
		int b = 3;
		
		System.out.println(a / b);//求商 = 3
		System.out.println(a % b);//求余 = 1
		
		double d = 10.0;	
		int c = 3;
		
		System.out.println(d / c);//求商3..33...
		
		int num1 = 10;	
		num1++;//自增1
		
		System.out.println(num1);//11
		
		int num2 = 10;	
		num2--;//自减1
		
		System.out.println(num2);//9
		
		int num3 = 5;
		
		//前++:先++,再打印自增后的值
		//后++:先打印当前值,再++
		
		System.out.println(++num3);//6
		
		System.out.println(num3);//6
		
		int num4 = 100;
		
		//前++:先++,再赋值
		//后++:先赋值,再++
		
		int num5 = num4++;
		
		System.out.println(num5);//100
		
		System.out.println(num4);//101
		
		
	}
	
}

二. 赋值运算符

概念:等号右边赋值给等号左边

  • = 直接赋值
  • += 求和后赋值
  • -= 求差后赋值
  • *= 求积后赋值
  • /= 求商后赋值
  • %= 求余后赋值
public class TestOperation2{
	
	public static void main(String[] args){
		
		int a = 10;//赋值运算符
		
		a += 5;//在a基础上+5  a = a + 5
		
		System.out.println(a);//15
		
		int b =20;
		
		b -= 3;//b = b - 3
		
		System.out.println(b);//17
		
		int c = 30;
		
		c %= 4;//c = c % 4
		
		System.out.println(c);//2
	}
	
}

三. 关系运算符

概念:两个操作数进行比较

  • >
  • <
  • >=
  • <=
  • ==
  • !=
public class TestOperation3{
	
	public static void main(String[] args){
		
		int a = 10;
		
		int b = 6;
		
		System.out.println(a > b);//true
		
		System.out.println(a < b);//false
		
		System.out.println(a >= b);//true
		
		System.out.println(a <= b);//false
		
		System.out.println(a == b);//false
		
		System.out.println(a != b);//true
	}
}

四. 逻辑运算符

概念:两个boolean类型的操作数或表达式进行逻辑比较

  • && 与(并且)
  • || 或(或者)
  • ! 非(相反)
public class TestOperation4{
	
	public static void main(String[] args){
		
		int javaScore  =100;
		
		int webScore = 99;
		
		//比较两者是否相等
		System.out.println(javaScore == webScore);//false
		
		//分别判断两者是否为满分
		System.out.println(javaScore == 100);//true
		System.out.println(webScore == 100);//false
		
		//一次性判断二者是否均为满分
		System.out.println(javaScore == 100 && webScore == 100);//false
		
		boolean result = javaScore == 100;
		
		//java的成绩是满分吗?
		System.out.println(result);//true
		
		//java的成绩不是满分吗?
		System.out.println(!result);//false
	}
}

五. 位运算符

位运算符用于处理整型和字符型的操作数,对其内存进行操作,数据在内存中以二进制形式表示

  • 主要有~(按位取反)、&(按位与)、|(按位或)、^(按位异或)、<<(左移)、>>(右移)、>>>(无符号右移)
public class TestOperation6 {

    public static void main(String[] args) {

        //位运算符(效率极高)
        //主要有~(按位取反)、&(按位与)、|(按位或)、^(按位异或)、<<(左移)、>>(右移)、>>>(无符号右移)
		/*

		<<	*2
		>>	/2

		0000 0001	1
		0000 0010	2
		0000 0100	4
		0000 1000	8
		0001 0000	16
		0010 0000	32
		0100 0000	64
		1000 0000	128
		*/
        //1. 与(&) 如果两个二进制位都是1,则与用算的结果为1,其他全都为0
        short a = 128;// 128二进制表现为1000 0000
        short b = 129;// 129二进制表现为1000 0001
        short c = -128;
        System.out.println("a和b'与'的结果是: " + (a & b));// 128(1000 0000)

        //2. 或(|) 如果两个二进制位都是0,则与运算的结果为0,其他全都为1
        // 即只要其中一个数字的二进制位是1,这个二进制位的运算结果就为1
        System.out.println("a和b'或'的结果是: " + (a | b));// 129(1000 0001)

        //3. 非(~) 如果二进制是0,则取反为1,如果二进制是1,则取反为0
        System.out.println("'非'a的结果是: " + ~a);// -129 (128 + 1 = 129 然后取负为-129)
        System.out.println("'非'b的结果是: " + ~b);// -130 (129 + 1 = 130 然后取负为-130)
        System.out.println("'非'c的结果是: " + ~c);//  127 (-128 + 1 = -127 然后取负为127)

        //4. 异或(^) 如果二进制位相同,则结果为0,否则为1
        System.out.println("a和b'异或'的结果是: " + (a ^ b));// 1(0000 0001)

        //5. 左移
        //移位可实现整数乘以或除以2的n次方的效果(左乘右除)
        System.out.println(2 << 3);//16 (2的一次方 往左移动三位 等同于于2 * (2的三次方) = 2 * 8 = 16)
        int i = 'a';
        System.out.println(i);//97
        System.out.println(i << 2);//388 (97 * 4 = 388)

        //6. 右移
        System.out.println(8 >> 2);//2  (8的一次方 往右移动两位 变为 8 / (2的平方) = 8 / 4 = 2)

    }
}
/**
 * 1. (正数(首位为0)的原反补码都一样)
 * 2. (负数(首位为1)的  反码:符号位不变, 后面取反, 补码:反码基础上加1)
 *
 *
 * 情况1:(求出补码首位为0(正数的原,反,补码都一样))
 * step1 -> -2原码:1000  0010
 * step2 -> -2反码:1111  1101
 * step3 -> -2补码:1111  1110
 * step4 -> 对-2的补码进行取反即可得到~(-2)的补码
 * step5 -> ~(-2)补码:0000  0001
 * step6 -> 由于符号位为0表示正数,因此补码和源码一样。转换为十进制就是1
 *
 * 情况2:求出补码首位为1(得将补码还原成原码)
 *     假如符号位为1则得先将补码转换成反码,再转换成原码
 *     例如:
 * 		   (6)原码:0000 0110
 *         (6)反码:0000 0110
 *         (6)补码:0000 0110
 *         
 *         ~(6)补码:1111 1001
 *         ~(6)反码:1111 1000
 *         ~(6)原码:1000 0111   (-7)
 *
 *
 */

六. 三元运算符

概念:将判断后的结果赋值给变量

  • ?:(布尔表达式?结果1 :结果2)当表达式为真获得结果1,反之获得结果2
public class TestOperation5{
	
	public static void main(String[] args){
		
		//1.判断
		//2.赋值
		//布尔表达式?值1:值2
		
		int javaScore = 100;
		
		String result = javaScore == 100 ? "恭喜" : "加油";
		
		System.out.println(result);//恭喜
		
		int webScore = 99;
		
		int result2 = webScore == 100 ? 666 : 111;
		
		System.out.println(result2);//111
	} 
}

自动类型提升

进行算数运算时:

  1. 两个操作数有一个为double,计算结果提升为double
  2. 如果操作数中没有double,有一个为float,计算结果提升为float
  3. 如果操作数中没有float,有一个为long,计算结果提升为long
  4. 如果操作数中没有long,有一个为int,计算结果提升为int
  5. 如果操作数中没有int,均为short或byte,计算结果仍旧提升为int
  6. 特殊:任何类型与String相加(+)时,实为拼接,其结果自动提升为String
public class TestTypeRaise{
	
	public static void main(String[] args){
		
		double d1 = 10.0;
		
		int i1 = 5;
		
		double d2 = d1 + i1;
		
		System.out.println(d2);//15.0
		
		//-----------------------------------------
		
		float f1 = 5.0F;
		
		short s1 = 20;
		
		float f2 = f1 + s1;
		
		System.out.println(f2);25.0
		
		int i2 = 5;
		
		long l1 = 10L;
		
		long l2 = i2 + l1;
		System.out.println(l2);//15
		
		//特殊:String的字符串拼接
		
		String str = "Hello";
		
		int i3 = 123;
		
		String str2 = str + i3;
		
		System.out.println(str2);//Hello123
		
		int javaScore = 100;
		
		String str3 = "java的成绩是:" + javaScore;

		System.out.println(str3);//java的成绩是:100
		
		System.out.println("java的成绩是:" + javaScore);//java的成绩是:100
		
		
	}
}
原文地址:https://www.cnblogs.com/MRASdoubleZ/p/14358923.html