【JavaSE】运算符和程序逻辑控制 (简洁版)

》》》我的博客主页
》》》我的gitee链接
关注我,在学习Java的道路上共同进步!!!

Alt



前言

本篇文章主要梳理运算符的一些语法细节和程序逻辑控制的格式规范,比较简单的知识点就一笔带过或直接不提。

一. 运算符

Alt

1.1. 算术运算符

1.1.1. 基本四则运算符

算术运算符主要注意除 / 和取余 % 的使用。

  • / 和 % 的除数不能是 0,否则报错。
  • int / int 还是 int 类型,如果商是小数,那就只保留整数部分。
  • % 一般用于 int 类型,也可以用于 double 类型。
System.out.println(5/2);//2
System.out.println((float)5/2);//2.5
System.out.println(5/(float)2);//2.5
System.out.println((float)(5/2));//2.0  5/2==2,2强转为float类型就是2.0

System.out.println(10 % 3);//1
System.out.println(-10 % 3);//-1
System.out.println(10 % -3);//1
System.out.println(-10 % -3);//-1

System.out.println(11.5%2);//1.5

1.1.2. 自增自减运算符

自增++ 自减 - -
注意:

  • 前置++先加后用,后置++先用后加。(自减同理)
  • 只有变量才能使用自增/自减运算符,常量不能使用,因为常量不允许被修改。
int a = 10;
System.out.println(a++);//10  先输出10,再自增1得11
System.out.println(++a);//12  先自增1得12,再输出
System.out.println(a--);//12  先输出12,再自减1得11
System.out.println(--a);//10  先自减1得10,再输出

1.2. 赋值运算符

复合赋值运算符:+= -= *= /= %=

注意:

  • 左操作数必须是变量。
  • 对于复合赋值运算符来说,即使类型范围大的转换为类型范围小的,也能自动类型转换。
int a = 4;
double b = 5.0;
a += b;//OK,使用复合赋值运算符,a+b的结果自动类型转换,double-->int
a = a + b;//error,即使与上一行代码意思相同,但这行需要强转,否则编译失败
a = (int)(a + b);//OK;

1.3. 关系运算符

关系运算符只需注意:
当需要多次判断时,不能连着写,比如:3 < a < 5 //error
3<a 只有可能是 true 或 false ,而布尔型不能与整型 5 比较。
所以得改成 (a>3) && (a<5)

1.4. 逻辑运算符

逻辑与: 表达式1 && 表达式2
表达式1 和 表达式2 都得是boolean的结果,表达式1 和 表达式2 都为 true 才是 true,否则都是 false

逻辑或: 表达式1 || 表达式2
表达式1 和 表达式2 都得是boolean的结果,表达式1 和 表达式2 都为 false 才是 false,否则都是 true

逻辑非: ! 表达式
表达式的结果只能是boolean类型

int a = 10;
System.out.println(!a);//error
System.out.println(!true);//OK,打印的是false
System.out.println(!false);//OK,打印的是true
System.out.println(!(a<0));//OK,打印的是true

1.4.1. 短路求值

&& 和 || 遵守短路求值的规则。
注意:
对于 && , 如果左侧表达式值为 false, 则表达式结果一定是 false, 无需计算右侧表达式。
对于 ||, 如果左侧表达式值为 true, 则表达式结果一定是 true, 无需计算右侧表达式。

短路求值的证明代码:

System.out.println(10 > 20 && 10 / 0 == 0); // 打印 false
System.out.println(10 < 20 || 10 / 0 == 0); // 打印 true
System.out.println(10 < 20 && 10 / 0 == 0); //error
System.out.println(10 > 20 || 10 / 0 == 0); //error

计算 10 / 0 中的除数是 0,程序本应该报错, 但是上面的代码却可以正常运行, 这可以说明 10 / 0 并没有真正被求值。

1.5. 位运算符

位运算符是按二进制位运算, 且不支持 float 和 double 类型的变量。
按位与 & :只有两个二进制数的同一位都是 1 ,结果才是 1 ,否则结果都是 0
按位与 | :只有两个二进制数的同一位都是 0 ,结果才是 0 ,否则结果都是 1
按位异或 ^ :两个二进制数的同一位相同为 0 ,相异为 1(就像找不同)
取反 ~ : 如果该位为 0 则转为 1, 如果该位为 1 则转为 0

int a = 0xf;//0x 前缀的数字为十六进制数字
System.out.printf("%x\n",a);//f
System.out.printf("%x\n", ~a);//fffffff0
//printf 能够格式化输出内容, %x 表示按照十六进制输出

下面的例子都是以 1 个字节的大小为例:
Alt
Alt
Alt
Alt
代码证明:

byte a = 10;
byte b = 20;
byte c = 22;
System.out.println(a & b);//0
System.out.println(a | b);//30
System.out.println(a ^ c);//28
System.out.println(~c);//-23

1.6. 移位运算符

移位运算符也是按二进制位运算, 且不支持 float 和 double 类型的变量。
右移 >> : 最右侧位不要了, 最左侧补符号位(正数补0, 负数补1)
左移 <<: 最左侧位不要了, 最右侧补 0
无符号右移 >>>: 最右侧位不要了, 最左侧补 0。负数不能无符号右移。
Alt
Alt
Alt

注意:

  • 左移 1 位, 相当于原数字 * 2. 左移 N 位, 相当于原数字 * 2 的N次方
  • 右移 1 位, 相当于原数字 / 2. 右移 N 位, 相当于原数字 / 2 的N次方
  • 由于计算机计算移位效率高于计算乘除, 当某个代码正好乘除 2 的N次方的时候可以用移位运算代替

1.7. 条件运算符

表达式1 ? 表达式2 : 表达式3
当 表达式1 的值为 true 时, 整个表达式的值为 表达式2 的值
当 表达式1 的值为 false 时, 整个表达式的值为 表达式3 的值
注意:

  • 除非能进行隐式类型转换,否则 表达式2 和 表达式3 一定得是同类型
  • 表达式不能单独存在,其产生的结果必须要被使用
int a = 10;
int b = 20;
int c = a > b? 1 : 2.0;//0K
int a = 10;
int b = 20;
a > b? a : b; //error
int c = a > b? a : b;//OK

二. 程序逻辑控制

Alt

Java与C语言的程序逻辑控制基本相同,这里主要关注格式规范,简单带过
不管语句体有几个语句,都加大括号 { },加了一定没错
if
else if
else 分支语句:

if(布尔表达式1) {
    
    
    // 语句1
}else if(布尔表达式2) {
    
    
    // 语句2
}else {
    
    
    // 语句3
}

switch 分支语句:
注意:

  • 在 case 和 default 中,非必要不省略 break
  • switch括号 () 中的表达式只能是以下类型:
    – 基本类型:byte、char、short、int,注意不能是long类型,也不能是 boolean类型,更不能是浮点型
    – 引用类型:String常量串、枚举类型
switch(表达式) {
    
    
	case 常量值1: {
    
    
		语句1;
		break;
	}
	case 常量值2: {
    
    
		语句2;
		break;
	}
	...
	default: {
    
    
		内容都不满足时执行语句;
		break;
	}
}

循环中的break和continue就不提了。
while 循环语句:

while(循环条件) {
    
    
	循环语句;
}

for 循环语句:

for(表达式①; 布尔表达式②; 表达式③) {
    
    
	表达式④;
}

for循环注意:

  • 表达式1: 用于初始化循环变量初始值设置,在循环最开始时执行,且只执行一次
  • 表达式2: 循环条件,满足则循环继续,否则循环结束
  • 表达式3: 循环变量的更新方式
  • 正常可结束的执行过程:①②③④—>②③④—>②③④—>②③④—>②③④—>②③④—>…—>②为false,循环结束。

do…while循环:

do{
    
    
	循环语句;
}while(循环条件);

do…while循环注意:

  • do while 循环最后的分号 ; 不要忘记

三. 一道题目

写一个方法返回该参数的二进制中 1 的个数,比如 5 的二进制表达是 101 ,有两个1,就返回2。
方法1:
Alt
Alt
方法2:
Alt
代码实现:

//写一个方法返回该参数的二进制中 1 的个数
public class Test {
    
    
    //这里写了两个方法,表示写了两种解题方法
    public static int numOf1sInBinary1(int x) {
    
    
        int tmp = x;
        int count = 0;
        //每次与 x 的最低位按位与 1 ,如果结果是 1,那么最低位就是 1,计数器count++
        //然后 x 无符号向右移1位。接着继续判断最低位是否是 1,如此循环
        while(tmp != 0) {
    
    
            if((tmp & 1) == 1) {
    
    
                count++;
            }
            tmp = tmp >>> 1;
        }
        return count;
    }
    public static int numOf1sInBinary2(int x) {
    
    
        int tmp = x;
        //记录进行按位与的次数
        int count = 0;
        //在每次按位与操作中,都会消去x的最右边的1,
        //因此按位与的次数就等于1的个数。这是一种比较高效的方法。
        while(tmp != 0) {
    
    
            tmp = tmp & (tmp-1);
            count++;
        }
        return count;
    }
    public static void main(String[] args) {
    
    
        int ret  = numOf1sInBinary1(5);
        System.out.println(ret);
        ret = numOf1sInBinary2(5);
        System.out.println(ret);
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_73276255/article/details/131960887