[从0开始学Java|第三天]Java运算符

算数运算符详解和综合练习

运算符和表达式

运算符: 对字面量或者变量进行操作的符号

表达式: 用运算符把字面量或者变量连接起来,符合Java语法的式子就可以称为表达式.

(不同运算符连接的表达式体现的是不同类型的表达式)

例:

java 复制代码
int a = 10;
int b = 20;
int c = a + b;
+:是运算符,并且是算数运算符
a + b:是表达式,由于+是算术运算符,所以这个表达式叫算数表达式

算数运算符

加+ 减- 乘* 除/ 取模,取余%

练习:(加+ 减- 乘*)

(源代码)

java 复制代码
package com.itheima.arithmeticoperator;

public class ArithmeticoperatorDemo1{
    public static void main(String[] args) {
        // +
        System.out.println(3 + 2);//5
        // -
        System.out.println(5 - 1);//4
        // *(shift + 数字8)
        System.out.println(7 * 9);//63

        //在代码中,如果有小数参与运算,结果有可能不精确
        System.out.println(1.1 + 1.1);//2.2
        System.out.println(1.1 + 1.01);//2.1100000000000003
        System.out.println(1.1 - 1.01);
        System.out.println(1.1 * 1.01);
    }
}

(运行结果截图)

练习:(除/ 取模,取余%)

(源代码)

java 复制代码
package com.itheima.arithmeticoperator;

public class ArithmeticoperatorDemo2{
    public static void main(String[] args) {
        // /
        System.out.println(10 / 2);//5
        System.out.println(10 / 3);//3
        System.out.println(10.0 / 3);//3.3333333333333335

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

        //应用场景

        //1.可以用取模来判断,A是否可以被B整除 ,例: A % B  10 % 3

        //2.可以判断A是否为偶数

        //(例: A % 2 如果结果为0,那么证明A是一个偶数;如果结果为1,那么证明A是一个奇数)
    }
}

(运行结果截图)

结论

1.整数参与计算,结果只能得到整数

2.小数参与计算,结果可能是不精确的,如果我们需要精确计算,那么需要用到后面的知识点

练习:数值拆分

**需求:**键盘录入一个三位数,将其拆分为个位,十位,百位后,打印在控制台

运行结果:

公式总结:

(源代码)

java 复制代码
package com.itheima.test;

import java.util.Scanner;

public class Test1 {
    public static void main(String[] args) {
        //键盘录入一个三位数,获取其中的个位,十位,百位

        //1.键盘录入一个三位数
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个三位数:");
        int number = sc.nextInt();

        //2.获取其中的个位,十位,百位
        //个位:number % 10
        //十位:number / 10 % 10
        //百位:number / 100 % 10
        //千位:number / 1000 % 10
        //...

        int ge = number % 10;
        int shi = number / 10 % 10;
        int bai = number / 100 % 10;
        System.out.println(ge);
        System.out.println(shi);
        System.out.println(bai);
    }
}

(运行结果截图)

隐式转换和强制转换

"+"操作的三种情况(数字相加 字符串相加 字符相加)

数字相加

数字进行运算时,数据类型不一样不能运算,需要转成一样的,才能运算.

类型转换的分类

隐式转换(自动类型提升)

把一个取值范围小的数值,转成取值范围大的数据

java 复制代码
范例:
    int a = 10;
    double b = a;//10.0
隐式转换的两种提升规则

-取值范围小的,和取值范围大的进行运算,小的会提升为大的,再进行运算

java 复制代码
public class Test{
    public static void main(String[] args){
        int a = 10;//整数
        double b =12.3;//小数
        double c = a + b;
    }
}

-byte short char 三种类型的数据在计算的时候,都会直接先提升为int,然后再进行运算

java 复制代码
public class Test{
    public static void main(String[] args){
        byte a = 10;
        byte b =12.3;
        int c = a + b;
    }
}
隐式转换小结

-取值范围:

byte < short < int < long < float < double

-什么时候转换?

数据类型不一样,不能进行计算,需要转成一样的才可以进行运算

-转换规则1:

取值范围小的,和取值范围大的进行运算,小的会提升为大的,再进行运算

-转换规则2:

byte short char 三种类型的数据在运算的时候,都会直接先提升为int,然后再进行运算

隐式转换练习

例:请问最终的运算结果是什么类型的?

java 复制代码
练习1:
byte b1 = 10;
byte b2 = 20;
数据类型 result = b1 + b2;//int
java 复制代码
练习2:
int i = 20;
long n = 100L;
double d = 20.0;
数据类型 result = i + n + d;//double
java 复制代码
练习3:
byte b = 10;
short s = 20;
long n = 100L;
数据类型 result = b + s +n;//long

强制转换

-如果把一个数值范围大的数值,赋值给取值范围小的变量.是不允许直接赋值的.如果一定要这么做就需要加入强制转换.

**-格式:**目标数据类型 变量名 = (目标数据类型) 被强制转换的数据

java 复制代码
范例:
    double a = 12.3;
    int b = (int) a;

**注意:**如果被强制转换的数据比较大,可能会发生错误

java 复制代码
范例:
    int a = 300;
    byte b = (byte) a;//此时数据会发生错误
强制转换练习
java 复制代码
练习:
    byte b1 = 10;
    byte b2 = 20;
    byte result = (目标数据类型) b1 + b2;
    //byte result = (byte) (b1 + b2);

(源代码)

java 复制代码
package com.itheima.arithmeticoperator;

public class ArithmeticoperatorDemo3 {
    public static void main(String[] args) {
        byte b1 = 100;
        byte b2 = 100;
        //(byte)b1 + b2 强制转换的是b1,并不是最终的结果
        byte result = (byte) (b1 + b2);
        System.out.println(result);//结果发生错误,因为要强制转换的数据过大,超出了byte的取值范围
    }
}

(运行结果截图)

字符串和字符的加操作

字符串的"+"操作(字符串相加)

-当"+"操作中出现字符串时,这个"+"是字符串连接符,而不是算数运算符了.会将前后的数据进行拼接,并产生一个新的字符串.

-连续进行"+"操作时,从左到右逐个执行

练习:看代码说结果

(源代码)

java 复制代码
练习1:
    System.out.println(3.7 + "abc");//"3.7abc"
练习2:
    System.out.println("abc" + true);//"abctrue"
练习3:
    System.out.println('中' + "abc" + true);//"中abctrue"
练习4:
    int age = 18;
    System.out.println("我的年龄是" + age + "岁");//"我的年龄是18岁"
    System.out.println("我的年龄是" + "age" + "岁");//"我的年龄是age岁"
练习5:
    System.out.println(1 + 2 + "abc" + 2 + 1);//"3abc21"

(运行结果截图)

练习:数值拆分

**需求:**键盘录入一个三位数,将其拆分为个位,十位,百位后,打印在控制台

运行结果:

(源代码)

java 复制代码
package com.itheima.test;
import java.util.Scanner;
public class Test1 {
    public static void main(String[] args) {
        //键盘录入一个三位数,获取其中的个位,十位,百位
        //1.键盘录入一个三位数
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个三位数:");
        int number = sc.nextInt();

        //2.获取其中的个位,十位,百位
        //个位:number % 10
        //十位:number / 10 % 10
        //...
        int ge = number % 10;
        int shi = number / 10 % 10;
        int bai = number / 100 % 10;
        System.out.println("个位是:" + ge);
        System.out.println("十位是:" + shi);
        System.out.println("百位是:" + bai);
    }
}

(运行结果截图)

字符相加

字符 + 字符 / 字符 + 数字 时,会把字符通过ASCII码表查询到对应的数字再进行计算.

java 复制代码
package com.itheima.arithmeticoperator;

public class ArithmeticoperatorDemo5{
    public static void main(String[] args) {
        char c = 'a';
        int result = c + 0;
        System.out.println(result);//97
    }
}

ASCII码表

练习:看代码说结果

(源代码)

java 复制代码
package com.itheima.arithmeticoperator;

public class ArithmeticoperatorDemo5{
    public static void main(String[] args) {
        System.out.println(1 + 'a');//98
        System.out.println('a' + "abc");//"aabc"
    }
}

(运行结果截图)

小结

注意事项:

  • / 和 % 的区别:两个数据做除法, / 取结果的商, % 取结果的余数

-整数操作只能得到整数,要想得到小数,必须有浮点数参与运算

自增自减运算符-基本使用

基本用法

注意事项:

++ 和 -- 既可以放在变量的前边,也可以放在变量的后边.

练习:

(源代码)

java 复制代码
package com.itheima.arithmeticoperator;

public class rithmeticoperatorDemo6 {
    public static void main(String[] args) {
        //++ 和 --
        int a = 10;
        //表示把变量a里面的值+1
        a++;
        System.out.println(a);//11
        //表示把变量a里面的值+1
        ++a;
        System.out.println(a);//12
        //表示把变量a里面的值-1
        a--;
        System.out.println(a);//11
        //表示把变量a里面的值-1
        --a;
        System.out.println(a);//10
    }
}

(运行结果截图)

两种用法

单独使用

++ 和 -- 无论是放在变量的前边还是后边,单独写一行结果是一样的.

参与运算

int a = 10;

int b = a++;

先用后加
int a = 10;

int b = ++a;

先加后用

例如:

(源代码)

java 复制代码
package com.itheima.test;

public class Test2 {
    public static void main(String[] args) {
        int x = 10;
        //后++:先用后加
        //先把x里面的值拿出来用,赋值给y,然后再进行自增
        //赋值给y的值是自增前的
        int y = x++;
        //前++:先加后用
        //先把x里面的值进行自增,然后再把自增后的结果赋值给左边的变量
        //赋值给z的值是自增后的
        int z = ++x;
        System.out.println("x = " + x);//12
        System.out.println("y = " + y);//10
        System.out.println("z = " + z);//12
    }
}

(运行结果截图)

赋值运算符和关系运算符

赋值运算符

分类

= 赋值 int a = 10;将10赋值给变量a

+= 加后赋值 a+=b,将a+b的值给a

-= 减后赋值 a-=b,将a-b的值给a

*= 乘后赋值 a*=b,将a*b的值给a

/= 除后赋值 a/=b,将a/b的商给a

%= 取余后赋值 a%b=b,将a/b的余数给a

注意事项:

扩展的赋值运算符隐含了强制类型转换

练习1:

(源代码)

java 复制代码
package assigningoperator;

public class AssigningoperatorDemo1 {
    public static void main(String[] args) {
        //+=
        //规则:将左边和右边进行相加,然后再把结果赋值给左边
        int a = 10;
        int b = 20;
        //先a+b,再把结果赋值给左边的变量a
        a += b;
        //细节:+= -= /= *= %= 底层都隐藏了强制类型转换
        //等同于a = (int) (a + b);
        System.out.println(a);//30
        System.out.println(b);//20
    }
}

(运行结果截图)

练习2:

(源代码)

java 复制代码
package assigningoperator;

public class AssigningoperatorDemo12 {
    public static void main(String[] args) {
        short s = 1;
        s += 1;
        //等同于: s = (short) (s + 1);
        System.out.println(s);
    }
}

(运行结果截图)

关系运算符

(关系运算符/比较运算符)的分类

== a==b,判断a和b的值是否相等,成立为true,不成立为false

!= a!=b,判断a和b的值是否不相等,成立为true,不成立为false

> a>b,判断a是否大于b,成立为true,不成立为false

>= a>=b,判断a是否大于等于b,成立为true,不成立为false

< a<b,判断a是否小于b,成立为true,不成立为false

<= a<=b,判断a是否小于等于b,成立为true,不成立为false

注意事项:

-关系运算符的结果都是boolean类型,要么是true,要么是false.

-千万不要把"==",误写成"=".

练习:(关系运算符)

(源代码)

java 复制代码
package compareoperator;

public class CompareoperatorDemo1 {
    public static void main(String[] args) {
        //关系运算符
        //1.== 判断左右两边是否相等
        int a = 10;
        int b = 10;
        int c = 20;
        System.out.println(a == b);//true
        System.out.println(a == c);//false

        //2.!= 判断左右两边是否不相等
        System.out.println(a != b);//false
        System.out.println(a != c);//true
    }
}

(运行结果截图)

练习:(比较运算符)

(源代码)

java 复制代码
package compareoperator;

public class CompareoperatorDemo2 {
    public static void main(String[] args) {
        //比较运算符
        //1.> 判断左边是否大于右边
        int a = 10;
        int b = 10;
        int c = 20;
        System.out.println(a > b);//false
        System.out.println(a > c);//false
        //2.>= 判断左边是否大于等于右边
        System.out.println(a >= b);//true
        System.out.println(a >= c);//false
        //3.< 判断左边是否小于右边
        System.out.println(a < b);//false
        System.out.println(a < c);//true
        //4.<= 判断左边是否小于等于右边
        System.out.println(a <= b);//true
        System.out.println(a <= c);//true
    }
}

(运行结果截图)

练习:约会

**需求:**您和您的约会对象在餐厅里面正在约会,键盘录入两个整数,表示您和您的约会对象衣服的时髦程度.(手动录入0~10之间的整数,不能录入其他),如果您的时髦程度大于您对象的时髦程度,相亲就成功,输出true,否则输出false.

(源代码)

java 复制代码
package com.itheima.test;

import java.util.Scanner;

public class Test3 {
    public static void main(String[] args) {
    /*需求:您和您的约会对象在餐厅里面正在约会,
    键盘录入两个整数,表示您和您的约会对象衣服的时髦程度.(手动录入0~10之间的整数,不能录入其他),
    如果您的时髦程度大于您对象的时髦程度,相亲就成功,输出true,否则输出false.*/
        //1.键盘录入两个整数表示衣服的时髦程度
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入您的时髦程度:");
        int myFashion = sc.nextInt();
        System.out.println("请输入您的约会对象的时髦程度:");
        int girlFasion = sc.nextInt();

        //2.判断您的时髦程度是否大于您的约会对象的时髦程度
        boolean result = myFashion > girlFasion;

        //3.输出结果
        System.out.println(result);
    }
}

(运行结果截图)

[输出true]

[输出false]

四种逻辑运算符

什么是逻辑运算符?

-在数学中,一个数据x,大于5,小于15,我们可以这样来进行表示:5 < x < 15.

-在Java中,需要把上面的式子先进行拆解,再进行合并表达.

拆解为: x > 5 和 x > 15

合并后: x > 5 和 x < 15

分类

& 逻辑与(且) 并且,两边都为真,结果才是真

| 逻辑或 或者,两边都为假,结果才是假

^ 逻辑异或 相同为false,不同为true

! 逻辑非 取反

练习:( 逻辑与& 逻辑或| )

(源代码)

java 复制代码
package logicoperator;

public class logicoperatorDemo1 {
    public static void main(String[] args) {
        //1.& 并且
        //两边都为真,结果才为真
        System.out.println(true & true);//true
        System.out.println(false & false);//false
        System.out.println(true & false);//false
        System.out.println(false & true);//false

        //2.| 或者
        //两边都为假,结果才为假
        System.out.println(true | true);//true
        System.out.println(false | false);//false
        System.out.println(true | false);//true
        System.out.println(false | true);//true
    }
}

(运行结果截图)

练习:( 逻辑异或^ 逻辑非! )

(源代码)

java 复制代码
package logicoperator;

public class logicoperatorDemo2 {
    public static void main(String[] args) {
        //3.^ 异或
        // 两个变量值相同,结果为false
        // 两个变量值不同,结果为true
        System.out.println(true & true);//false
        System.out.println(false & false);//false
        System.out.println(true & false);//true
        System.out.println(false & true);//true

        //! 取反
        // 变量值为true,结果为false
        // 变量值为false,结果为true
        System.out.println(!true);//false
        System.out.println(!false);//true
    }
}

(运行结果截图)

短路逻辑运算符

分类

&& 短路与 结果和 & 相同,但是有短路效果

|| 短路或 结果和 | 相同,但是有短路效果

注意事项:

  • & 和 | ,无论是左边是true还是false,右边都要执行

  • && 和 || ,如果左边能确定整个表达式的结果,右边不执行

  • && :左边为false,右边不管是true还是false,整个表达式的结果一定是false

  • || :左边为true,右边不管是true还是false,整个表达式的结果一定是true

-最常用的逻辑运算符: && || !

练习:(短路与&& 短路或||)

(源代码)

java 复制代码
package logicoperator;

public class logicoperatorDemo3 {
    public static void main(String[] args) {
        //1.&&
        //运行结果跟单个&是一样的
        //表示两边都为真,结果才是真
        System.out.println(true & true);//true
        System.out.println(false & false);//false
        System.out.println(true & false);//false
        System.out.println(false & true);//false

        //2.||
        //运行结果跟单个|是一样的
        //表示两边都为假,结果才是假
        System.out.println(true | true);//true
        System.out.println(false | false);//false
        System.out.println(true | false);//true
        System.out.println(false | true);//true

        //3.短路运算符具有短路效果
        //简单理解:当左边的表达式能确定最终的结果,那么右边就不会参与运行了
        int a = 10;
        int b = 10;
        boolean result = ++a < 5 && ++b < 5;
        System.out.println(result);//false
        System.out.println(a);//11
        System.out.println(b);//10
    }
}

(运行结果截图)

练习:数字6

**需求:**数字6是一个真正伟大的数字,键盘录入两个整数,如果其中一个为6,最终结果输出true;如果它们的和为6的倍数.最终结果输出true.其他情况都是false.

(源代码)

java 复制代码
package com.itheima.test;

import java.util.Scanner;

public class Test4 {
    public static void main(String[] args) {
        /*数字6是一个真正伟大的数字,键盘录入两个整数,
        如果其中一个为6,最终结果输出true;
        如果它们的和为6的倍数.最终结果输出true.
        其他情况都是false. */

        //分析:
        //1.键盘录入两个整数 变量a  变量b
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入第一个整数:");
        int number1 = sc.nextInt();
        System.out.println("请输入第二个整数:");
        int number2 = sc.nextInt();

        //2.a == 6 || b == 6 || (a + b) % 6 == 0
        //如果满足其中的一个,那么就可以输出true
        boolean result = number1 == 6 || number2 == 6 || (number1 + number2) % 6 == 0;
        System.out.println(result);
    }
}

(运行结果截图)

三元运算符和运算符的优先级

三元运算符

什么是三元运算符?

可以进行判断,根据判断的结果得到不同的内容

(三元运算符/三元表达式)格式

格式: 关系表达式 ? 表达式1 : 表达式2;

范例:求两个数的较大值

**需求:**使用三元运算符,获取两个数的较大值

(源代码)

java 复制代码
package com.itheima.ternaryoperator;

public class ternaryoperatorDemo1 {
    public static void main(String[] args) {
        //需求:使用三元运算符,获取两个数的较大值

        //分析:
        //1.定义两个变量记录两个整数
        int number1 = 10;
        int number2 = 20;

        //2.使用三元运算符获取两个数的较大值
        //格式:    关系表达式 ? 表达式1 : 表达式2;
        //注意:整个三元运算符的结果必须被使用
        int max = number1 > number2 ? number1 : number2;
        System.out.println(max);//20
        System.out.println(number1 > number2 ? number1 : number2);//20
    }
}

(运行结果截图)

计算规则:

-首先计算关系表达式的值

-如果值为true,表达式1的值就是运算结果

-如果值为false,表达式2的值就是运算结果

练习:两只老虎

**需求:**动物园里有两只老虎,体重分别通过键盘录入获得,请用程序实现判断两只老虎的体重是否相同

(源代码)

java 复制代码
package com.itheima.test;

import java.util.Scanner;

public class Test5 {
    public static void main(String[] args) {
        /*需求:动物园里有两只老虎,体重分别通过键盘录入获得,
        请用程序实现判断两只老虎的体重是否相同*/

        //分析:
        //1.键盘录入两只老虎的体重
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入第一只老虎的体重:");
        int weight1 = sc.nextInt();
        System.out.println("请输入第二只老虎的体重:");
        int weight2 = sc.nextInt();

        //2.比较
        String result = weight1 == weight2? "相同" : "不同";
        System.out.println(result);
    }
}

(运行结果截图)

练习:求最高身高的和尚

**需求:**一座寺庙里住着三个和尚,已知他们的身高分别为150cm,210cm,165cm,请用程序实现获取这三个和尚的最高身高

(源代码)

java 复制代码
package com.itheima.test;

public class Test6 {
    public static void main(String[] args) {
        /*需求:一座寺庙里住着三个和尚,已知它们的身高分别为150cm,210cm,165cm,
        请用程序实现获取这三个和尚的最高身高*/

        //1.定义三个变量,分别存储和尚的身高
        int height1 = 150;
        int height2 = 210;
        int height3 = 165;
        //2.拿着第一个和尚和第二个和尚进行比较
        //再拿着结果跟第三个和尚进行比较即可
        int temp = height1 > height2 ? height1 : height2;
        int max = temp > height3 ? temp : height3;
        //3.打印结果
        System.out.println(max);
    }
}

(运行结果截图)

运算符优先级

运算符的通用写法

java 复制代码
public class Test{
    public static void main(String[] args){
        int a = 10;
        int b =20;
        int c = 30;
        //System.out.println(a + b * c);
        System.out.println(a + (b * c));
    }
}

运算符优先级表

原码反码补码

什么是原码?

**原码:**十进制数据的二进制表现形式,最左边是符号位,0为正,1为负.

原码的弊端

利用原码对正数进行计算时不会有问题的.

但是如果是负数计算,结果就会出错,实际运算的结果,跟我们预期的结果是相反的.

什么是反码?

**反码:**正数的反码是其本身,负数的反码是符号位保持不变,其余位取反

反码出现的目的

为了解决原码不能计算负数的问题而出现的.

反码的计算规则

正数的反码不变,负数的反码在原码的基础上,符号位不变,数值取反,0变1,1变0.

反码的弊端

负数运算的时候,如果结果不跨0,是没有任何问题的,但是如果结果跨0,跟实际结果会有1的偏差.

例: (-4 + 1)

例: (-4 - 1)

什么是补码?

**补码:**正数的补码是其本身,负数的补码是在其反码的基础上+1

补码出现的目的

为了解决负数计算时跨0的问题而出现的.

补码的计算规则

正数的补码不变,负数的补码在反码的基础上+1.

另外补码还能多记录一个特殊的值-128,该数据在1个字节下,没有原码和反码.

补码的注意点

计算机中的存储和计算都是以补码的形式进行的.

例: (-4 + 2)

例: (-4 + 5)

基本数据类型

多学N招

隐式转换

强制转换

其他的运算符

& 逻辑与 0为false,1为true


| 逻辑或 0为false,1为true


<< 左移 向左移动,低位补0

(左边是高位,右边是低位)


>> 右移 向右移动,高位补0或1

(原来是负数就补1,原来是正数就补0)


>>> 无符号右移 向右移动,高位补0

相关推荐
4 小时前
java关于内部类
java·开发语言
好好沉淀4 小时前
Java 项目中的 .idea 与 target 文件夹
java·开发语言·intellij-idea
gusijin4 小时前
解决idea启动报错java: OutOfMemoryError: insufficient memory
java·ide·intellij-idea
To Be Clean Coder4 小时前
【Spring源码】createBean如何寻找构造器(二)——单参数构造器的场景
java·后端·spring
lsx2024064 小时前
FastAPI 交互式 API 文档
开发语言
吨~吨~吨~5 小时前
解决 IntelliJ IDEA 运行时“命令行过长”问题:使用 JAR
java·ide·intellij-idea
你才是臭弟弟5 小时前
SpringBoot 集成MinIo(根据上传文件.后缀自动归类)
java·spring boot·后端
短剑重铸之日5 小时前
《设计模式》第二篇:单例模式
java·单例模式·设计模式·懒汉式·恶汉式
VCR__5 小时前
python第三次作业
开发语言·python
码农水水5 小时前
得物Java面试被问:消息队列的死信队列和重试机制
java·开发语言·jvm·数据结构·机器学习·面试·职场和发展