Java语法基础(二)

运算符

运算符优先级

优先级描述运算符
1括号()、[]
2正负号+、-
3自增自减,非++、- -、!
4乘除,取余*、/、%
5加减+、-
6移位运算<<、>>、>>>
7大小关系>、>=、<、<=
8相等关系==、!=
9按位与&
10按位异或^
11按位或|
12逻辑与&&
13逻辑或||
14条件运算?:
15赋值运算=、+=、-=、*=、/=、%=
16位赋值运算&=、|=、<<=、>>=、>>>=

算术运算符

这里写图片描述

/*
    ++,--的练习题

    第一题:
    int a = 10;
    int b = 10;
    int c = 10;

    a = b++;
    c = --a;
    b = ++a;
    a = c--;
    请分别计算出a,b,c的值

    第二题:
    int x = 4;
    int y = (x++)+(++x)+(x*10);
    请分别计算出x,y的值
*/
class OperatorTest {
    public static void main(String[] args) {
        int a = 10;
        int b = 10;
        int c = 10;

        a = b++; //a=10,b=11,c=10
        c = --a; //a=9,b=11,c=9
        b = ++a; //a=10,b=10,c=9
        a = c--; //a=9,b=10,c=8

        System.out.println("a:"+a);
        System.out.println("b:"+b);
        System.out.println("c:"+c);
        System.out.println("--------------");

        int x = 4;
        int y = (x++)+(++x)+(x*10);
        //4+6+60
        //x=5,6

        System.out.println("x:"+x);
        System.out.println("y:"+y);
    }
}

赋值运算符


  • = , +=, -=, *=, /=, %=
  • =为基本的赋值运算符,其他的为扩展的赋值运算符

/*
    面试题:
        short s=1;s = s+1; 

        short s=1;s+=1;
        上面两个代码有没有问题,如果有,那里有问题。

        为什么第二个木有问题呢?
            扩展的赋值运算符其实隐含了一个强制类型转换。

            s += 1;
            不是等价于 s = s + 1;
            而是等价于 s = (s的数据类型)(s + 1);
*/
class OperatorTest {
    public static void main(String[] args) {
        //short s = 1;
        //s = s + 1;
        //System.out.println(s);

        short s = 1;
        s += 1; //好像是 s = s + 1;
        System.out.println(s);
    }
}

比较运算符

这里写图片描述


  • 注1:比较运算符的结果都是boolean型,也就是要么是true,要么是false。
  • 注2:比较运算符“==”不能误写成“=”

逻辑运算符

这里写图片描述

  • “&”和“&&”的区别:

    单&时,左边无论真假,右边都进行运算;
    双&时,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算。
    “|”和“||”的区别同理,双或时,左边为真,右边不参与运算。
    

位运算符

这里写图片描述

这里写图片描述

  • 位运算是直接对二进制进行运算
/*
    位运算符:
        &,|,^,~
        <<,>>,>>>

    注意:
        要做位运算,首先要把数据转换为二进制。
*/
class OperatorDemo {
    public static void main(String[] args) {
        //&,|,^,~

        int a = 3;
        int b = 4;

        System.out.println(3 & 4);
        System.out.println(3 | 4);
        System.out.println(3 ^ 4);
        System.out.println(~3);
    }
}
/*
    分析:因为是位运算,所以我们必须先把数据换算成二进制。

    3的二进制:11
        00000000 00000000 00000000 00000011
    4的二进制:100
        00000000 00000000 00000000 00000100

    &位与运算:有0则0。
        00000000 00000000 00000000 00000011
       &00000000 00000000 00000000 00000100
        -----------------------------------
        00000000 00000000 00000000 00000000
        结果是:0

    |位或运算:有1则1。
        00000000 00000000 00000000 00000011
       |00000000 00000000 00000000 00000100
        -----------------------------------
        00000000 00000000 00000000 00000111
        结果是:7

    ^位异或运算:相同则0,不同则1。
        00000000 00000000 00000000 00000011
       &00000000 00000000 00000000 00000100
        -----------------------------------
        00000000 00000000 00000000 00000111
        结果是:7

    ~按位取反运算符:0变1,1变0
        00000000 00000000 00000000 00000011
       ~11111111 11111111 11111111 11111100 (补码)

       补码:11111111 11111111 11111111 11111100
       反码:11111111 11111111 11111111 11111011
       原码:10000000 00000000 00000000 00000100
        结果是:-4
*/
/*
    <<:左移   左边最高位丢弃,右边补齐0
    >>:右移   最高位是0,左边补齐0;最高为是1,左边补齐1
    >>>:无符号右移 无论最高位是0还是1,左边补齐0
*/
class OperatorDemo3 {
    public static void main(String[] args) {
        //<< 把<<左边的数据乘以2的移动次幂
        System.out.println(3 << 2); //3*2^2 = 3*4 = 12;

        //>> 把>>左边的数据除以2的移动次幂
        System.out.println(24 >> 2); //24 / 2^2 = 24 / 4 = 6
        System.out.println(24 >>> 2);

        System.out.println(-24 >> 2); 
        System.out.println(-24 >>> 2);
    }
}
/*
    计算出3的二进制:11
        00000000 00000000 00000000 00000011
    (00)000000 00000000 00000000 0000001100

    >>的移动:  
    计算出24的二进制:11000
        原码:10000000 00000000 00000000 00011000
        反码:11111111 11111111 11111111 11100111
        补码:11111111 11111111 11111111 11101000

        11111111 11111111 11111111 11101000
        1111111111 11111111 11111111 111010(00) 补码

        补码:1111111111 11111111 11111111 111010
        反码:1111111111 11111111 11111111 111001
        原码:1000000000 00000000 00000000 000110

        结果:-6

    >>>的移动:
        计算出24的二进制:11000
        原码:10000000 00000000 00000000 00011000
        反码:11111111 11111111 11111111 11100111
        补码:11111111 11111111 11111111 11101000

        11111111 11111111 11111111 11101000
        0011111111 11111111 11111111 111010(00)

        结果:
*/

^ 的特点:一个数据对另一个数据位异或两次,该数本身不变。

/*
    ^的特点:一个数据对另一个数据位异或两次,该数本身不变。
*/
class OperatorDemo2 {
    public static void main(String[] args) {
        int a = 10;
        int b = 20;

        System.out.println(a ^ b ^ b); //10
        System.out.println(a ^ b ^ a); //20
    }
}

三目运算符


  • 格式
    • (关系表达式)?表达式1:表达式2;
    • 如果条件为true,运算后的结果是表达式1;
    • 如果条件为false,运算后的结果是表达式2;
  • 示例:
    • 获取两个数中大数。
    • int x=3,y=4,z;
    • z = (x>y)?x:y;//z变量存储的就是两个数的大数。

面试题

面试题 :

/*
    面试题1 :
        请自己实现两个整数变量的交换
        注意:以后讲课的过程中,我没有明确指定数据的类型,默认int类型。
*/
class OperatorTest {
    public static void main(String[] args) {
        int a = 10;
        int b = 20;

        System.out.println("a:"+a+",b:"+b);

        //方式1:使用第三方变量(开发中用的)
        int c = a;
        a = b;
        b = c;
        System.out.println("a:"+a+",b:"+b);
        System.out.println("------------");

        //方式2:用位异或实现(面试用)
        //左边:a,b,a
        //右边:a ^ b
        a = a ^ b;
        b = a ^ b; //a ^ b ^ b = a
        a = a ^ b; //a ^ b ^ a = b
        System.out.println("a:"+a+",b:"+b);

        //方式3:用变量相加的做法
        a = a + b; //a=30
        b = a - b; //b=10
        a = a - b; //a=20
        System.out.println("a:"+a+",b:"+b);

        //方式4:一句话搞定
        b = (a+b) - (a=b); //b=30-20=10,a=20
        System.out.println("a:"+a+",b:"+b);
    }
}
/*
    面试题2 :
        请用最有效率的方式写出计算2乘以8的结果?
            2 << 3
*/

键盘录入数据


  • 如何实现键盘录入数据呢?(目前先记住使用)

    • 导包(位置放到class定义的上面)

      • import java.util.Scanner;
    • 创建对象

      • Scanner sc = new Scanner(System.in);
    • 接收数据

      • int x = sc.nextInt();

import java.util.Scanner;

class ScannerDemo {
    public static void main(String[] args) {
        //创建键盘录入数据对象
        Scanner sc = new Scanner(System.in);

        System.out.println("请你输入一个数据:");
        int x = sc.nextInt();

        System.out.println("你输入的数据是:"+x);
    }
}
/*
    键盘录入练习:
        键盘录入两个数据,并对这两个数据求和,输出其结果
*/
import java.util.Scanner;

class ScannerTest {
    public static void main(String[] args) {
        //键盘录入两个数据,并对这两个数据求和,输出其结果
        //创建键盘录入对象
        Scanner sc = new Scanner(System.in);

        System.out.println("请输入第一个数据:");
        int x = sc.nextInt();

        System.out.println("请输入第二个数据:");
        int y = sc.nextInt();

        //把键盘录入的数据进行相加即可
        int sum = (x + y);
        System.out.println("sum:"+sum);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值