自学内容网 自学内容网

Java程序基础③Java运算符+逻辑控制+循环结构+输入输出

目录

1. Java运算符

1.1 算术运算符

1.2 增量运算符

1.3 关系运算符

1.4 逻辑运算符

1.5 位运算符

1.6 移位操作符

1.7(三目)条件操作符

1.8 操作符优先级

2. Java逻辑控制

2.1 顺序结构

2.2 分支结构

2.2.1 if 语句

2.2.2 switch语句

3. 循环结构

3.1 while循环

3.2 for循环

3.3 do-while循环

3.4 break和continue

4. Java的输入输出

4.1 输出到控制台

4.2 从键盘输入

本篇完。


1. Java运算符

        运算符是什么呢?其实这个问题很简单,运算符在我们的生活中很常见,失去了它,数学基本报废了,像“+ , - ,* , /”都是我们最基本的运算符。即:对操作数进行操作时使用的符号,不同操作符的含义各不相同。
    java作为一门优秀的程序设计语言,同样也提供有一整套丰富的运算符来操作变量。Java中的运算符分为:算术运算符(±*/),逻辑运算符(&&,||等),位运算符(& 、|等),关系操作符(><等),移位操作符和条件操作符等。

1.1 算术运算符

本四则运算符:+ - * /(也可以叫双目运算符)

代码示例:

int a = 10;
        int b = 5;
        System.out.println(a + b); // 加
        System.out.println(a - b); // 减
        System.out.println(a * b); // 乘
        System.out.println(a / b); // 除
        System.out.println(a % b); // 模,就是除法的余数

        需要注意的是运算符使用的时候,要保证运算符两边是相同的类型变量,否则会发生隐式的类型提升,Java会自动将占用内存较小的变量类型提升为占用内存大的变量类型。

int i = d * a;
        double d1 = d * a;
        //两行代码均发生了隐式的类型提升

        如代码,变量a被提升为double类型的,并且运算符计算出来的结果也是两个变量中占用内存最大的决定,如代码,a是int类型,d是double类型的,那么这两个变量经过算术运算符运算之后的结果必然是double类型的,代码1系统会报错。

        算术运算符都是二元运算符,运算符必须要有左右两个操作数,int/int类型还是int型,这个不会改变,并且会先下取整。

int a = 3;
        int b = 2;
        System.out.println(a / b);

        结果是1.5吗?当然不是1.5,在Java中整型的运算结果只会是整型,那也就是不可能会有浮点型出现,则最终结果是经过了向下取整得出来的结果,也就是1。

    %不仅可以对整数取模,也可以对浮点数取模,但没什么意义,一般是对整型取模。两侧操作数类型不同时,类型小的向类型大的提升,运算结果也是类型大的决定。


1.2 增量运算符

    增量运算符:+=、-=、*=、/=

        int a = 1;
        a += 1; // a = a + 1   2
        a -= 1; // a = a - 1   1
        a /= 1; // a = a / 1   1
        a %= 1; // a = a % 1   0**

        在增量运算符中会发生强制类型转换,运算符的右操作数和左操作数类型不同时,会将右操作数强转为左操作数的类型,从而将结果控制成原来的类型。

自增/自减运算符:++ --,就是自增1,自减1的操作。

int a = 10;
        a++; // 后置++
        ++a; // 前置++
        --a; // 前置--
        a--; // 后置--

    自增/自减运算符是单目运算符,只需要一个操作数即可。当自增/自减运算符单独使用的时候,后置和前置没用区别,都是一样的结果。

    当自增/自减运算符和其他运算符混搭使用的时候,区别就体现出来了,前置++是先进行自增的操作了之后再运算其他的操作符,后置++是先运算其他的操作符后再进行自增的操作,–也是如此。


1.3 关系运算符

    关系运算符主要有6个,分别是== 、!= 、> 、<、<=、>=,关系运算符的结果只能是boolean类型的,也就是true或者false。

int a = 10;
        int b = 5;
        System.out.println(a == b); // false
        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); // true

        在Java中,=是赋予,==是相等的意思,和实际的数学是有一定的区别的。

        当代码写成10 > a > 1时,系统是无法运算的,因为系统会先执行判断10 > a是否为true还是false,判断得的结果不管是true还是false,此时都变成了booleana类型的和int类型的进行比较了,类型不同,如何比较?无法比较。


1.4 逻辑运算符

逻辑运算符主要有三个:与或非:&& 、|| 、 !,运算结果都是boolean类型的

1.4.1 逻辑与运算符

    语法规则:表达式1 && 表达式2,并且左右两边的表达式的结果必须是Boolean类型的。相当于现实生活中的必须要有手机并且手机要有电才可以进行上网。

  • 两个表达式如果有一个是假的,那么整个表达式都是假的
  • 两个表达式必须要都是真的,整个表达式才是真的
  • 两个表达式都是假的,整个表达式也是假的
int a = 10;
        int b = 5;
        System.out.println(a == b && a != b); // false
        System.out.println(a != b && a > b); // true
        System.out.println(a < b && a == b); // false

        并且在逻辑与表达式中含有一个短路现象,意思就是如果表达式1为真,那么表达式2才会执行。如果表达式1是假的,那么表达式2是不会执行的,直接跳过执行表达式2直接得出结果。

1.4.2 逻辑或操作符

    语法规则:表达式1 || 表达式2,并且左右两边的表达式的结果必须是Boolean类型的。相当于现实生活中的只要手机有电,不管手机有没有流量都可以玩游戏。

  • 两个表达式,只要有一个是真的结果就是真的
  • 两个表达式,有一个是假的,另外一个是真的,那结果就是真的
  • 两个表达式,两个都是假的,那结果就是假的
        int a = 10;
        int b = 5;
        System.out.println(a == b || a < b); // false
        System.out.println(a != b || a > b); // true
        System.out.println(a > b || a == b); // true
        System.out.println(a == b || a > b); // true

    逻辑或操作符也含有短路现象,但是逻辑或和逻辑与的短路现象不一样,当表达式1为真时,表达式2不在执行,当表达式1为假时,表达式2执行

1.4.3 逻辑非运算符

    逻辑非很好理解,就是取反的意思,假的变成真的,真的变成假的,但是Java的逻辑非和C语言的逻辑非不太一样,Java的逻辑非的参数只能对结果是Boolean类型的,参数不可以是变量,但是C语言的可以。

        int a = 10;
        int b = 5;
        System.out.println(!(a == 0)); // 原本为假,现在为真
        System.out.println(!(a != 0)); // 原本为真,现在为假S
        system.out.println(!a); // !变量,不符合语法,编译器报错

1.5 位运算符

    Java中数据存储的最小单位是字节,数据操作的最小单位是比特位,字节是最小的存储单位,一个字节由8个比特位组成,多个字节组合在一起可以表示不同的数据类型。

    位运算符主要有:& 、 | 、^、,除了是单目操作符以外,其他的都是双目操作符。位操作表示按二进制位运算,计算机的底层以及各种数据都是由一串一串的由0和1组成的二进制代码,按位运算就是按二进制的每一位进行运算。

按位与&         如果两个二进制位都是1,那结果就是1,否则为0;

按位或|      如果两个二进制位都是0的话,结果就为0,否则为1.

按位取反~      如果二进制位是1,则转为0,如果二进制位是0则转为1

按位异或^     如果两个数字的二进制位序列相同,那么结果位0,如果二进制位不同则结果位0.


1.6 移位操作符

移位操作符主要有两个:<< , >> , >>>,都是双目操作符,有都是按照二进制位来运算的。

左移操作符<<    二进制序列的最左位不要了,将右边的代码移动覆盖过去。

System.out.println(1 << 1) ; // 等于2

        1 << 1的意思是将1的二进制代码向左移动1位,将左边的第一位丢弃,然后在最右边补0,以达到32个二进制位,无论左边抛弃的是1还是0,右边都是永恒不变的补0。
    并且<<还有乘法的效果,1 << 1 相当于1 * 2


右移操作符>>    抛弃最右边的,在最左侧补符号位(正数补0 ,负数补1)

        System.out.println(2 >> 1); // 等于1
        System.out.println(-2 >> 1); // 等于-1

        2 >> 1表示将2的二进制代码向右移动一位,在最右边补符号位,以达到32位二进制代码的条件,右移还有除法的效果,2 >> 1相当于2 / 2的效果
    因为一个数字默认是int型的,int占用4个字节,也就是32个比特位,那就是说一个数字占用32个比特位,所以抛弃多少位就要补多少位。


无符号右移>>>    抛弃最右边的,在最左侧补0,和右移差不多,但是有本质上的区别,无符号右移,无论是移动正数还是负数,结果都只能是正数。

        System.out.println(8 >>> 1); // 等于4
        System.out.println(-1 >>> 1); // 等于2147483647

1.7(三目)条件操作符

    语法格式:表达式1?表达式2:表达式3

  • 表达式1为真,执行表达式2,表达式3不执行
  • 表达式1为假,表达式2不执行,执行表达式3
        int a = 10;
        int b = 20;
        int c = a > b ? a : b;

类似于如果那么否则。

    并且条件运算符必须要进行接收,否则会报错,并且作为接收的变量必须适用于表达式2和表达式3的结果,否则有可能会发生隐式转换或者报错。

1.8 操作符优先级

        在一条表达式中,各个运算符可以混合起来进行运算,但是运算符的优先级不同,比如:* 和 / 的优先级要高于 + 和 - ,有些情况下稍不注意,可能就会造成很大的麻烦。

// 求a和b的平均值
int a = 10;
int b = 20;
int c = a + (b - a) >> 1;
System.out.println(c);

        上述表达式中,由于 + 的优先级要高于 >> , 因此a先和b-a的结果做加法,整体为20,最后再进行右移,因此结果 为10。

        注意:运算符之间是有优先级的,具体的规则我们不必记忆,在可能存在歧义的代码中加上括号即可。

Java操作符总结:

  • 左移1位,相当于原数字乘以2,左移N位,相当于原数字 * 2的N次方
  • 右移1位,等效于原数字除以2,左移N位,相当于原数字 / 2的N次方
  • 计算机计算移位效率高于计算乘除,所以建议当每个代码正好需要乘除2的N次方的时候可以使用移位运算来代替。
  • 逻辑与:有假为假
  • 逻辑或:有真为真
  • 按位与:有0为0
  • 按位或:有1为1
  • 按位异或:相同为0,相异为1
  • 左移:补0
  • 右移:补符号位
  • 无符号右移:补0
  • +±-:注意是单独使用还是混合使用,单独使用无需考虑前置后置,混合使用需要考虑前置后置

2. Java逻辑控制

        何为逻辑控制?逻辑控制是一种通过逻辑运算和决策来实现系统控制的方法。 它利用布尔代数的原理进行逻辑判断和计算,以决定所需操作和输出。 逻辑控制可以根据输入信号的状态和规则,执行相应的操作和行为,使得系统能够按照指定的要求完成任务。

2.1 顺序结构

序结构比较简单,就是按代码的顺序一行一行向下执行

  int x = 1;
        int y = 2;
        System.out.println(x); // 输出1
        System.out.println(y); // 输出2
  int x = 1;
        int y = 2;
        System.out.println(y); // 输出2
        System.out.println(x); // 输出1

代码顺序不同输出的结果就不同。

2.2 分支结构

2.2.1 if 语句

语法格式:

if(布尔表达式) {
    //语句
}
  • 如果布尔表达式的结果为true,那么执行语句,否则什么都不执行
  • 如果布尔表达式的结果为false,那么什么都不执行

可以这样用:

if(x > y) {
            System.out.println("x 大于 y");
                }
        

        if(x < y) {
            System.out.println("x 小于 y");
                }

但当我们加上else时,if 语句才真正完整,语法规则:

        if(布尔表达式) {
            //语句1
        } else {
            //语句2
        }
  • 此时不管布尔表达式的结果是true还是false,都会执行相应的语句
  • 当布尔表达式的结果为true时,执行语句1
  • 结果为false时,执行表达式2
if(x > y) {
            System.out.println("x 大于 y");
        } else {
            System.out.println("x 不大于 y");
        }

        当然了,if语句也是支持嵌套使用,简单来说就是if语句里面还有if语句,从而达到了事情不一定只有两种结果的可能性,也就是说一件事情有几种结果,此时就可以通过嵌套使用if语句来解决。语法规则如下:

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

        当布尔表达式1为false时,系统直接判断布尔表达式2的真假,是true就执行语句2,是false就执行语句2。

        if(x < y) {
            System.out.println("x 小于 y");
        } else if (x == y){
            System.out.println("x 等于 y");
        } else {
            System.out.println("x 大于 y");
        }

        一般情况下,即便是嵌套if语句,但结果也只能是只有一个。嵌套使用if语句的时候需要注意悬空if的情况,else之和最近的if进行匹配。悬空if问题只需要找到距离else最近的if就可以了。


2.2.2 switch语句

语法规则:

  switch(表达式) {
      case 常量值1:
          语句1;
          [break;]
      case 常量值2:
          语句2;
          [break;]
      case 常量值3:
          语句3;
          [break;]
      case 常量值4:
          语句4;
          [break;]
      default:
          任何条件都不符合的语句;
          [break;]
  }

        表达式可以是基本类型:int型,char型,byte型,short型,不可以是flout型,double型,long型,boolean型,也可以是引用类型:String常量串,枚举类型。

    并且在使用switch的过程中必须要加上break,否则系统会把所以的case全部执行。

        int n = 1;
        switch(n) {
            case 1:
                System.out.println("哈哈");
            case 2:
                System.out.println("哈哈");

            default:
                System.out.println("不哈哈");
        }

        正常情况下应该是只单独输出一次“哈哈”,但是该处没有使用break,则最终结果是全部打印。只有加上break才可以得到我们想要的结果

        int n = 1;
        switch(n) {
            case 1:
                System.out.println("哈哈");
                break;
            case 2:
                System.out.println("哈哈");
                break;

            default:
                System.out.println("不哈哈");
                break;
        }

switch也支持循环嵌套,但是用起来很丑,不建议用。

        int n = 1;
        switch(n) {
            case 1:
                switch(n) {
                    case 1:
                        System.out.println("哈哈");
                        break;
                    default:
                        System.out.println("不哈哈");
                        break;
                }
                break;
            case 2:
                System.out.println("哈哈");
                break;

            default:
                System.out.println("不哈哈");
                break;
        }

        switch的表达式不可以使用太复杂的表达式,只能表示单一的条件,多条件的话,系统不知道使用那个case,此时系统就会报错。


3. 循环结构

3.1 while循环

语法规则:

        while(循环条件) {
            // 循环体
        }

循环条件可以理解为布尔表达式

  • 循环条件结果是true,则进入循环体。
  • 循环条件结果是false,则无法进入循环。
  • 如果循环条件是true,切该条件不会改变,则该循环是死循环,系统报错。

注意事项:
1、while下面的语句可以不写{},但是不写的话只能支持一条语句,建议还是加上{}

        int n = 10;
        while(n > 0)
            System.out.println("哈哈");
            n--;

        此时没有加上{},则n–语句不属于while循环,此时循环体内无法改变循环变量n的值,则该循环是死循环。

2、while同一行后面不要加上“;”,否则后面的循环体就不属于循环了,加上“;”表示循环结束了。


3.2 for循环

语法规则:

        for (表达式1; 布尔表达式2; 表达式3) {
            // 循环体
        }
  • 表达式1:用于初始化循环遍历初始值,在循环最开始的时候执行,并且只执行一次。
  • 表达式2:循环条件,满足则进行运行循环,不满足则退出循环
  • 表达式3:更新循环变量的值,防止出现死循环。

注意事项:

  1. for下面的语句可以不写{},但是不写的话只能支持一条语句,建议还是加上{}
  2. for同一行后面不要加上“;”,否则后面的循环体就不属于循环了,加上“;”表示循环结束了。
  3. 在Java里面,因为Java是经过高度包装的计算机编程语言,提高了程序员编写程序的效率,在Java中,你只需要输入fori,再按回车键,for循环的整体结构就出来了,我们只需要在稍微修改即可使用。

3.3 do-while循环

语法规则:

        do {
            // 循环体
        }while(循环变量);

        do-while循环和其他的循环不太一样,while和for循环都是需要经过条件判断才可以执行循环体,但是do-while循环是不经过条件判断就可以执行一次循环体,也就是说无论条件是否有效,循环体都至少会执行一次。
    do-while是先执行循环语句,再进行判断循环条件,循环条件成立则进行执行循环体,否则退出循环。
    do-while循环最后的分号不要忘记,否则系统报错。


3.4 break和continue

break语句的作用是提前结束循环。

        for (int n = 10; 1 < n; n--) {
            System.out.println(n);
            if(n == 3) {
                break;
            }
        }

通常使用在循环里面,当有特殊需求时使用break提前结束循环。


        continue的作用是跳过continue后面的语句,直接跳到判断循环条件的步骤。简单来说就是:跳出本次循环,进入下一次循环。

        for (int n = 10; 1 < n; n--) {
            if(n == 5) {
                continue;
            }
            System.out.println(n);
        }

        当循环执行到continue的时候,直接跳出本次循环,后面的打印不执行,直接进入下一次循环的循环条件判断。


4. Java的输入输出

4.1 输出到控制台

        System.out.println("哈哈"); // 输出哈哈,自动换行
        System.out.print("哈哈"); // 输出哈哈,不换行
        System.out.printf(format,msg); // 格式化输入

  • println输出的内容自带\n,print不带有\n
  • printf的格式化输出方式和C语言的输出方式基本一样。都是使用“%”+转换符。
  • 只需要输入sout,系统就会自动生成输出代码了。

格式化字符串:

转换符类型示例
%d十进制整数(%d, 100) -> 100
%x十六进制整数(%x, 100) -> 64
%o八进制整数(%o, 100) -> 144
%f定点浮点数(%f, 100f) -> 100.000000
%e指数浮点数(%e, 100f) -> 1.000000e+02
%g通用浮点数(%g, 100f) -> 100.000
%a十六进制浮点数(%a, 100) -> 0x1.9p6
%s字符串(%s, "hello") -> hello
%c字符(%c, 'A') -> A
%b布尔值(%b, 100) -> true
%%百分号(%.2f%%, 2/7f) -> 0.29%

格式化输出示例:

4.2 从键盘输入

  • 需要使用到其他包的类。但系统会帮你导包。
  • 需要使用Scanner类读取字符串/整数/浮点数

语法规则:

Scanner 类名 = new Scanner(System.in);
        int 变量名 = 类名.nextInt();

        但是需要注意的是使用“new 类名.nextString”输入字符串的时候,该输入必须要是第一个输入,否则会将上一次输入后按的回车给读走,从而导致无法正常读取字符串。

第三次输入字符时报错了。

有2种解决方式:

  1. 字符串输入放第一行,避免读取回车
  2. 多加一次字符串输入,把上一次输入的回车读取

字符串输入放第一行:

多加一次字符串输入,把上一次输入的回车读取:


本篇完。

下一篇学习Java方法函数的内容。


原文地址:https://blog.csdn.net/GRrtx/article/details/143642374

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!