【Java】运算符,程序逻辑控制

目录

运算符

算术运算符

基本四则运算符,加减乘除模(+- */%)

增量运算符+=,-=,*=,/=, %= 

 自增/自减运算符++,--

关系运算符

逻辑运算符

位运算符

移位运算

条件运算符

运算符优先级

程序的逻辑控制

顺序结构

分支结构

if语句

switch语句

循环结构

 while循环

 do..while循环

 for循环

关键字break

关键字continue


        java中的运算符可以分为,算术运算符,移位运算符,位运算符,关系运算符,逻辑运算符,还有条件运算符等等。


运算符

算术运算符

基本四则运算符,加减乘除模(+- */%)

  1. 都是双目操作符,进行使用的时候必须要有左右两个操作数。
  2. 除操作要想出现小数部分,要么左右操作数有一个是浮点数。要么左右两个整数操作数有一个和1.0f相乘,赋值给浮点数类型。
int a = 3;
int b = 2;
System.out.println(a / b);//结果是1

float c = 2;
System.out.println(a / c);//结果是1.5

float d = a*1.0f / b;
System.out.println(d);//结果是1.5

   3. 除操作和取模操作右操作数不可以为0。

   4.%不仅可以对整型取模,也可以对double类型取模,但没有意义,一般都是对整型取模的。

   5.操作数两侧类型不一致时,向类型表示数范围大的提升。

   6.取模操作,左右操作数是支持负数的。有负数进行取模操作的话,本质逻辑就是想办法往右操作数靠,然后剩下的就是模。-5 % 2 , 2*(-2) = -4,-5-(-4) = -1; -5%(-2) , -2 * 2 = -4, -5-(-4) = -1

public static void main(String[] args) {
        System.out.println(5 % 2);//1
        System.out.println(-5 % 2);//-1
        System.out.println(5 % -2);//1
        System.out.println(-5 % -2);//-1
    }

增量运算符+=,-=,*=,/=, %= 

        该运算符只能用于变量

int a = 1;
a += 2;  //相当于a = a + 2

a -= 2;  //相当于a = a - 2

a *= 2;  //相当于a = a * 2

a /= 2;  //相当于a = a / 2

  

  

        a +=(-=,/=,*=,%=) 1,与 a = a +(-,/,*,%) 1 的区别就是,左右操作符类型不匹配时,增量运算符自动进行了强制类型转换。有可能会造成数据的丢失,使用的时候需要注意。

 自增/自减运算符++,--

++是给变量的值减1,--是给变量的值加1

int a = 1;
a++; 
++a; //相当于 a = a + 1
a--; 
--a; //相当于 a = a - 1

  

  

  

  • 该运算符不可以用于常量
  • 该运算符自动进行了强制类型转换
  • 当变量自加(自减)赋给另一个元素的时候,前置加加(减减)自增完了的值去赋值,后置加加(减减)先用原来的值赋值再自加(减)。即前置加加(减减)先加后用,后置加加(减减)先用后加。

关系运算符

        关系运算符主要有六个: == ,!= ,>,<,<=,>= ,关系运算符的计算结果都是布尔类型的值。

1.注意=和==的区别,java中=的含义是赋值操作,java中的==才是数学中的=,相等比较操作。

2.java不支持多次判断连着写。eg.   9 < a < 10这种写法是不支持的。要写多次判断,得用到逻辑运算符来进行连接。

逻辑运算符

逻辑运算符有&&,||,!,运算结果是boolean类型。

1.逻辑与&&

  左右两个表达式都为真,结果才为真,否则结果为假。(即全真则为真)

2.逻辑或 ||

   左右两个表达式都为假,结果才为假,否则结果为真。(即全假则为假)

3.逻辑非 !

   !表达式,表达式为真,结果则为假;表达式为假,结果则为真。(可以理解为逻辑上的取反)

4.  && 和 || 左右表达式必须都是boolean类型的结果。

    && 也叫短路与, ||也叫短路或。都遵循着短路求值的规则。

 System.out.println((4 < 3) && (1 / 0 == 0));
//编译成功结果为false
 System.out.println((4 > 3) && (1 / 0 == 0)); 
// 报错:Exception in thread "main" java.lang.ArithmeticException: / by zero

System.out.println((4 < 3) || (1 / 0 == 0));
//报错:Exception in thread "main" java.lang.ArithmeticException: / by zero
System.out.println((4 > 3) || (1 / 0 == 0)); 
// 编译成功结果为true

  从上面的代码可以显然得出结论

  && 左表达式为假的时候,直接得出结果为假,不再判断右表达式。

  ||    左表达式为真的时候,直接得出结果为真,不再判断右表达式。

5.  & 和 |如果左右表达式的结果为boolean类型时,也表是逻辑运算,与&&和 ||不同的是,不支持短路求值,左右表达式都要进行判断。

位运算符

        位运算符有&,|,~,^,其中只有~是单目操作符。

        java中数据存储的最小单位是字节(byte/Byte),数据操作的最小单位是比特位。(bit)

        位运算顾名思义就是按照二进制位,也就是比特位来进行运算。

        进行位运算首先得将数据转换为二进制补码(因为数据在计算机中存储的形式是二进制补码)(不知道怎么转换的建议百度),然后进行按位运算。

1、按位与&:两个对应位的二进制都为1,则结果为1,否则结果则为0。

int a = 5;
int b = -3;
System.out.println(a & b);//结果为5

 2.按位或 |:两个对应二进制为都为0,则结果为0,否则结果为1。

        如何运算方面不做赘述,参考上面即可。

3.按位取反~:如果该位二进制位为0则转为1,如果该位二进制位1则转为0。

        写出一个数的补码,然后按位取反。

4.按位异或^ :两个对应为二进制相同则为0,相异则为1。

移位运算

移位运算:<<,>>,>>>。都是二元运算。和上面的位运算符一样都是按照二进制比特位来算的。

1.左移 <<:最左边的比特位不要了,最右边补0。

左移丢掉的是符号位(java里面没有无符号数),所以可能左移之后正数会变成负数。

2.右移(有符号)>>:最右边的比特位不要了,最左边补符号位。

 

3.无符号右移>>>:最右边的比特位不要了,最左边补0。

4. 左移1位相当于原数字乘2;左移n位相当于原数字乘2的n次方。

    右移1位相当于原数字除2;左移n位相当于原数字除2的n次方。

    计算机移位的效率远高于计算乘除,当某个代码刚好乘除2的n次方的时候可以用移位运算来代替乘除运算。

    移动负数位或者移位位数过大都没有意义。

条件运算符

表达式1 ?表达式2 :表达式3

是个三目运算符,是条件判断语句的简化。

表达式1结果为true时,整个表达式的值为表达式2的值,反之则为表达式3的值。

表达式不能单独存在,其产生的结果必须要被使用。

运算符优先级

运算符有优先级。你觉得可能会产生歧义的时候就加个括号。或者遇到的时候去百度一下。


程序的逻辑控制

  完成任何事背后都是有逻辑控制的。比如人是先起床后刷牙而不是先刷牙后起床。而程序的运行也要有逻辑控制。

  逻辑控制分为顺序结构,选择结构,循环结构。

顺序结构

 就是按照代码书写的顺序一条一条执行。

System.out.println("a");
System.out.println("b");
//输出的结果为ab

 而将两条代码顺序更换之后输出的结果则不一样了

System.out.println("b");
System.out.println("a");
//输出的结果为ba

分支结构

不同的情况指向不同的结果。

if语句

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

else if 和 else 语句都是可以省略的。根据使用场景灵活变通即可。

if后面可以不加{ },但此时只能控制一条语句。

分号问题

if(a < b)后面不加分号,则没有输出。

if(a < b)后面加分号之后,这个分号就成了if语句的语句体,而 { }中的代码块则成了一个与if无关的代码块。

悬垂else问题 

else 和最近if匹配。匹配和是否与if对齐无关。

switch语句

switch (表达式){
            case 常量值1:{
                语句;
                [break;]
            }
            .......
            case 常量值n:{
                语句;
                [break;]
            }
            default:{
                内容都不满足时执行的语句;
                [break;]
            }
        }

1.多个case后面的常量值不可以重复。

2.switch括号里的表达式类型(表达式类型就是表达式返回值是什么类型的)只能是:byte,short,int,char,String常量串,枚举常量。(' '一对单引号括起来表示字符,"  "一对双引号括起来表示字符串。)

 

3.switch括号里的表达式类型可以和case后面的常量类型不一致,但是前提是这两个能够互相兼容,也就是可以互相转换。

但是即使编译器不报错也有可能出现bug。比如char和int类型那里。(因为字符1本质上是数字49),所以建议switch括号里的表达式类型和case后面的常量类型尽量保持一致。

4. 假如switch括号表达式的值是常量值m,那么程序就跳过前面的case语句,直接从case常量值m这条语句切入进去。这条语句控制的是在switch语句的代码块中这条语句下方的所有语句。但遇到break的时候,switch语句就会直接结束。

所以要保证每个case都只输出对应的结果,每个case最后都得加上break语句。

5.switch不能表达复杂的条件。

循环结构

 while循环

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

 1.while下面的语句可以不写{ },但此时只能控制一条语句。

 2.while()直接加;表示while语句的结束,不能控制下面的语句。

 3.while后的循环条件只能是布尔表达式。不可以是常量! 

 do..while循环

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

注意点和while循环一样 

 for循环

for (表达式1; 表达式2; 表达式3) {
   语句;
}

 表达式1:初始化循环变量,只在循环开始的时候执行,只执行一次。

 表达式2:循环条件,满足循环条件就继续,不满足循环就结束。

 表达式3:循环变量的更新。

 注意点和while循环类似。

关键字break

break的功能是让循环提前结束,也可以说是跳出循环。

但是当循环嵌套的时候,break只能跳出它所在的最近的while循环体。

关键字continue

continue的功能是结束正在执行的这次循环,然后立即进入下次循环。

break 和 continue可以这样区分,你在日复一日的007,天天都很劳累。break就是你辞职了,不干了永远都可以休息了。continue就是你和主管请了一天假休息,但第二天还得继续007。


欢迎评论区交流。如果这篇blog对你有些许帮助,可以给我一个小赞吗?

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值