Java 语言基本语法(运算符)

Java 语言基本语法(运算符)

在 Java 语言中 运算符分为:

  1. 算术运算符
  2. 赋值运算符
  3. 比较运算符
  4. 逻辑运算符
  5. 位运算符
  6. 三元运算符

1. 算术运算符

(正)+ (负)- + - * / % (前)++ ++(后) (前)-- --(后)

                // 注: 取模运算 结果的符号与被模数相同(开发中经常用被取模符号判断能否被除尽的情况)
		int number1 = 12;
		int numberOne = 5;
		System.out.println("number1 % numberOne = " + number1/numberOne);// 2

		int number2 = -12;
		int numberTwo = 5;
		System.out.println("number2 % numberTwo = " + number2/numberTwo);// -2

		int number3 = 12;
		int numberThree = -5;
		System.out.println("number3 % numberThree = " + number3/numberThree);// 2

		int number4 = -12;
		int numberFour = -5;
		System.out.println("number4 % numberFour = " + number4/numberFour);// -2

		/*
		(前)++ ++(后)
		i++ 先运算 再自增
		++i 先自增 然后再运算
		 */
		int a1 = 10;
		a1++;// ++a1 ---> 11
		System.out.println(a1);// 11(因为在上面已经执行了语句(a1++/++a1)无论先赋值后运算还是先运算后赋值 语句已经执行完成 ---> 代表已经自增完成)

		// 注意点!
		short s1 = 10;
		// s1 = s1 + 1;// 编译失败(因为容量小于 int 类型的在做运算的时候 结果会自动转换为 int 类型)
		s1++;// 自增不会改变变量本身的数据类型
		System.out.println(s1);// 11

		// 问题:
		byte b1 = 127;// byte(-127~128)
		b1++;// 编译能通过 因为自增不改变数据类型
		System.out.println(b1);// -128 因为(127 ---> 01111111 进位 + 1 ---> 10000000(-128))

		/*
		(前)-- --(后)(同理)
		i++ 先运算 再自减
		++i 先自减 然后再运算
		(自减自加再结束语句后 一定会进行了自减或者自加)
		 */
		int a4 = 10;
		int b4 = --a4;// 先自减 再运算 (--a4/a4自减 = 9)b4 = 9|a4 本身因自减也是9
		System.out.println("a4 = " + a4 + "b4 =" + b4);// a4 = 9/b4 = 9

2. 赋值运算符

= (+= -= *= /= %= 这几种写法不会改变数据本身的数据类型)

                // 赋值符号
		int i1 = 10;
		// 连续赋值
		int i2,i3;
		i2 = i3 = 11;
		int i4 = 10, i5 = 11;

		// += 其余同理
		int num1 = 10;
		num2 += 10;// num2 = num2 + 10;
		// 但是上面两个式子是有区别的
		System.out.println(num2);

		// eg:
		short s1 = 10;
		// s1 = s1 + 10;// 编译失败 小于 int 容量的数据类型 在做运算的时候结果自动转换为 int 类型
		s1 += 10;// 编译通过 这种写法不会改变变量本身数据类型
		System.out.println(s1);

3. 比较运算符

== != > < >= <= instanceof
注:

  1. 比较运算符的结果是布尔类型

  2. < >= <= 只能用在数值类型之间

  3. == != 不仅可以用在数值类型之间 还可是使用在引用类型之间

4. 逻辑运算符

逻辑运算符只能适用于布尔类型(区分逻辑运算符和位运算符 取决于操作的数据类型 逻辑运算符操作的都是布尔类型的变量)
| & ! && || ^_(逻辑异或 相同 False 不同 True)

		/*
		区分 & 和 &&(逻辑与和短路与)
		因为短路与“&&” 只要左边先遇见 False 直接短路 不会执行后方(num2++)
		相同点:
		1. &/&& 运算结果相同
		2. 当符号左边是 true 时 而这都会执行右边的运算
		不同点:
		1. 当左边是 false "&"会继续执行右边的运算 "&&"因为短路所以不再执行

		在开发中推荐使用短路状态
		 */
		boolean b1 = false;
		int num1 = 10;
		if (b1 & (num1++ > 0)) {
			System.out.println("True");
		} else {
			System.out.println("False");
		}
		System.out.println(num1);// 11

		boolean b2 = false;
		int num2 = 10;
		if (b2 && (num2++ > 0)) {
			System.out.println("True");
		} else {
			System.out.println("False");
		}
		System.out.println(num2);// 10
		/*
		区分 | 和 ||(逻辑或和短路或)
		同理于逻辑与和短路与 但是逻辑或和短路或的区别在于 当左边是 true 的时候 "||"短路或就会短路 不会再执行右边的运算 而"|"逻辑或会继续执行右边的运算
		在开发中 推荐使用短路状态(逻辑系列两边都会执行 但是短路系列 若左边符合条件 只会执行左边)
		 */

5. 位运算符

  • "<<" 左移运算符
  • ">>" 右移运算符
  • ">>>" 无符号右移运算符(无"<<<")
  • "&" 与运算 "|" 或运算 "^" 异或运算 "~" 取反运算
  • 注意:位运算符能够运算的是整数
                /*
		1. <</>> 左右移动
		eg: 21
		0001 0101
		21 << 2
		0101 0100
		----------
		84
		方式:左移相当于在右边的位上面补充"0/1" 右移相当于在左边的位置上补充"0/1"(原最高位是0 全部使用0补充 原最高位是1 全部使用1补充)
		结论:位运算符操作的都是整型数据 对于左移来说 在一定范围内每向左移动一位 相当于在原数基础上乘以2
		在一定范围内每向右移动一位 相当于在原数基础上除以2(左右移动 n 位 就是在原基础上 乘/除 2^n)
		eg: 古老的面试题 ---> 最高效的方式计算2 * 8!
		2 << 3 或者 8 << 1

		2. >>> 无符号右移
		不管原数正负 左边都使用0补充 言外之意:原数是负数 无符号右移一位 原数变为正数

		3. & | ^ ~
		由底层二进制计算
		eg:
		    0000 1100 ---> 12
		&   0000 0101 ---> 5
		------------------------------
		    0000 0100 ---> 4
		与:两个必须都是1 ---> 1 否则是0

		    0000 1100 ---> 12
		|   0000 0101 ---> 5
		------------------------------
		    0000 1101 ---> 13
		或:两个其中一个是1 ---> 1 否则是0

		    0000 1100 ---> 12
		^  0000 0101 ---> 5
		------------------------------
		    0000 1001 ---> 9
		异或:相同为0 不同则是1

		    0000 0110 ---> 6
		------------------------------
		~   1111 1001 ---> -7
		取反:就是原数二进制全部取反(包含符号位)(~-7(-7取反)---> 互为取反变为原数)
		 */
		int m = 12;
		int n = 5;
		System.out.println("m & n:" + (m & n));// 4
		System.out.println("m | n:" + (m | n));// 13
		System.out.println("m ^ n:" + (m ^ n));// 9

6. 三元运算符(三目运算符)

  1. 结构:(条件表达式)?表达式1:表达式2

  2. 说明:

    1. 条件表达式的结果是布尔类型
    2. 根据条件表达式真假 决定执行表达式1或者表达式2
      • 条件表达式 == true ---> 执行表达式1
      • 条件表达式 == false ---> 执行表达式2
    3. 表达式1/2要求统一为一个类型 因为需要一个结果去统一接收 eg:(m > n)? "m" : n;// 编译错误
    4. 三元运算符可以嵌套使用
    5. 凡是可以使用三元运算符的地方都可以改写为 if-else 反之则不行 ---> 说明3
    6. 如果程序既可以使用三元运算符又可以使用 if-else 优先使用三元运算符 原因:简洁 执行效率高 毕竟只是一个运算符... .. .
                // 获取两个数中的较大值
		int m = 12;
		int n = 5;

		int max = (m > n)? m : n;
		System.out.println(max);

		//三元运算符可以嵌套
		String max1 = (m > n)? "m" : (m == n)? "m == n" : "n";
		System.out.println(max1);

		// 获取三个数的最大值
		int n1 = 12;
		int n2 = 30;
		int n3 = -43;
		int max2 = (n1 > n2)? n1 : n2;
		int max3 = (max2 > n3)? max2 : n3;
		System.out.println(max3);

		// If-Else
		if (m > n){
			System.out.println(m);
		} else {
			System.out.println(n);
		}
                /*
                运算符的优先级
                凡是想早运算直接加"()"
                 */

简单练习

		/*
		随意给出整数 打印它的个位数 十位数 百位数的值
		 */
		Scanner input = new Scanner(System.in);
		System.out.println("请输入三位数整数!");
		int number = input.nextInt();
		int individual = number % 10;
		int ten = number /10 % 10;
		int hundred = number / 100;
		System.out.println("个位:" + individual);
		System.out.println("十位:" + ten);
		System.out.println("百位:" + hundred);
posted @ 2021-03-26 15:30  weinen  阅读(210)  评论(0)    收藏  举报