JavaSE之运算符

课前小例


package com.zpwd.chapter1;

public class HelloWord {
public static void main(String[] args) {
    // 整型
    // System.out.println(num1);//该行为错误写法
    int num1 = 10;
    // boolean num1= true; //该行为错误写法
    boolean num2 = true;
    System.out.println(num1+','+num2 )
    }
}

在方法中声明的变量成为局部变量*。
*同一个代码块不能声明名称相同的变量。
*在声明变量之前,不能使用该变量,因为代码是顺序执行的,JVM 在栈内存中找到main栈针时,找不到下方声明的变量(先声明后发现)。
*JVM内存三个重要的区域(共有5个区域):堆内存(heap)、栈内存(stack)、方法区
PS输出1的结果是:10,true。


赋值运算符:= 、+= 、-= 、*= 、/=

package com.zpwd.chapter1;

public class HelloWord {
public static void main(String[] args) {
    int num = 10;
    num += 10;
    System.out.println(num);//结果为:20
    }
}

num+=10的效果等同于num = num +10


算数运算符:+ 、- 、* 、/ 、% 、++ 、--

package com.zpwd.chapter1;

public class HelloWord {
public static void main(String[] args) {
    System.out.println(5 + 6 + 7); // 结果:18
    System.out.println(5 + "6" + 7);// 结果:567
    System.out.println(5 + 6 + "7");// 结果:117
    System.out.println(5 + 6 + '7');// 结果:66
            int v1 = 99;
    int v2 = 1;
    System.out.println("v1+v2=" + (99 + 1));
    System.out.println(v1 + "+" + v2 + "=" + (v1 + v2));

    // 整型除以整型,得到的结果还是整型,取整(非四舍五入)
    System.out.println(7 / 2);// 结果为:3
    System.out.println(7.0 / 2);// 结果为:3.5
    System.out.println(7 / 2.0);// 结果为:3.5

    // %取余数(模运算),结果的正负只与被除数的正负有关,小数%大数 = 小数
    System.out.println(5 % 2);// 结果为:1
    System.out.println(-5 % 2);// 结果为:-1
    System.out.println(5 % -2);// 结果为:1
    System.out.println(-5 % -2);// 结果为:-1
    System.out.println(-2 % -5);// 结果为:-2 

    // ++,--:自增,自减(变量 在原有的赋值上加一或者减一)
    int i = 0;
    i++;
    System.out.println(i);// 结果为:1 一般在循环中使用
    // ++在前,先自增再运算;++在后,先自增再运算
    int a = 1;
    int b = ++a;
    System.out.println(b);// 结果为2,a先自增变为2,再赋值给b
    int c = a++;
    System.out.println(c);// 结果为1,先将a的值1赋值给c,a再自增
    // 运行Java代码的时候,电脑会先运行JVM,Java虚拟机将.java文件、编译成.class文件
    // 栈内存:存放程序运行时所需的局部变量

    // 下列代码较为特殊,代码在执行时,JVM找到该条main栈针,内存会开辟一个临时空间,
    // 将x变量复制出一份,放在临时空间中,并进行自增操作,但原有的x值不变。程序执行
    // 完毕后,临时空间被自动回收。因此输出的x值并没有改变。(面试题经常出现)
    int x = 1;
    x = x++;
    x = x++;
    System.out.println(x);// 结果为1。
    }
}

!!注意以下几点:
1、算数运算符+有点小特殊,既可以表示两个数相加,又可以表示字符串的拼接,当+两边是数字时,表示相加;当两边是字符串时,表示拼接,既有字符串又有数字时还是起到拼接作用
2、两个整数相除时,得到的结果是取整(非四舍五入)。
3、两个数取模时,模的正负只与被除数有关;若小数%大数,得到的结果被除数(例:-4%5=-4)。
4、在做自增或自减运算时,运算符(++、--)在前面就表示先自增或自减再进行其他处理;若运算符(++、--)在后面时,则先做其他的再做自增或自减。


比较运算符:> 、 < 、== 、!=

package com.zpwd.chapter1;

public class HelloWord {
public static void main(String[] args) {
    int age = 22;
    if (age > 18) {
        System.out.println("成年人");
    }
    if (age < 18) {
        System.out.println("未年人");
    }
    if (age == 18) {
        System.out.println("18");
    }
    if (age != 18) {
        System.out.println("非18");
    }
    }
}

结果为:成年人 非18


逻辑运算符 :&& 、|| 、!

package com.zpwd.chapter1;

public class HelloWord {
public static void main(String[] args) {
    int age = 22;
    double height = 1.99;
    if (age > 18 && height > 1.8) {
        System.out.println("大于18岁且高于一米八");
    }
    if (age > 18 || height < 1.8) {
        System.out.println("大于18岁或高于一米八");
    }
    if (!(age > 18)) {
        System.out.println("不大于18岁");
    }
    }
}

结果为:大于18岁且高于一米八


位运算符 :& 、| 、^ 、~ 、>> 、<< 、>>>

package com.zpwd.chapter1;

public class HelloWord {
public static void main(String[] args) {
    int age = 22;
    // &,参加运算时,两位都为1才为1,否则都为0
    System.out.println(6 & 5);// 结果为:4
    //6的二进制 110,5的二进制101。结果为:100 ,100的十进制为4
    System.out.println(3 & 5);// 结果为:1
    // |,参加运算时,只有两位都为0才为0,否则都为1。
    System.out.println(5 | 6);// 结果为:7
    // ^,亦或:只要参加的运算的两位不同才为1,否则都为0。
    System.out.println(5 ^ 6);// 结果为:3
    // << :a<<b ,将a的二进制数据左移b位,右边移空的部分补0。
    System.out.println(4 << 4); // 结果为:4*(2的4次幂)
    }
}

!!位运算只是针对二进制的整数进行运算


条件运算符:判断表达式1 ? 数值1 :数值2

package com.zpwd.chapter1;

public class HelloWord {
public static void main(String[] args) {
    int a1 = 10;
    int a2 = 4;
    int a3 = a1 > a2 ? a1 : a2;
    System.out.println(a3);//结果为:10
    
    a3 = 999<1?a1:a2;
    System.out.println(a3);//结果为:4
    }
}

表达式1中的数值,与?后面的表达式2中的数值没有任何关系。


面试题

1、按位与&,按位| 和逻辑与&&,逻辑或||的异同点。

  • 都能进行逻辑判断。
  • 按位与&,按位|能参加按位运算。
  • 逻辑与&&,逻辑或||具有短路特性。
    2、请给出下列的输出结果。
    int x = 1;
    x = x++;
    x = x++;
    System.out.println(x)
  • 结果为:1
    3、两个数互换位置(不使用临时变量)
    4、如果快速的让2等于8。
    2<<2(位运算是二进制运算,计算机本身识别的就是01代码,不需要翻译,直接交给计算机,所以效率最快)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容