java中运算符的优先级

题目

写出下列表达式的值,设:x=3,y=17,yn=true。
(1)x + y * x-- = 54
(2)-x * y + y = -34
(3)x < y && yn = true
(4)x > y || !yn = false
(5)y != ++x ? x : y = 4
(6)y++ / --x = 8

最近看到这样的一道题目,初看之下考的运算符的优先级,但仔细一看发现还有点别的东西在里边。

测试代码

package test;


/**
 *
 * 
 写出下列表达式的值,设:x=3,y=17,yn=true。
(1)x + y * x-- = 54
(2)-x * y + y = -34
(3)x < y && yn = true
(4)x > y || !yn = false
(5)y != ++x ? x : y = 4
(6)y++ / --x = 8
 *
 */
public class Test {
    public static void main(String[] args) {
        test1(3,17);
        test2(3,17);
        test3(3,17,true);
        test4(3,17,true);
        test5(3,17);
        test6(3,17);
    }
    
    public static void test1(int x,int y) {
        System.out.println("x + y * x-- 计算结果"+(x + y * x--));
    }
    public static void test2(int x,int y) {
        System.out.println("-x * y + y 计算结果"+(-x * y + y));
    }
    public static void test3(int x,int y , boolean yn) {
        System.out.println("x < y && yn 计算结果"+(x < y && yn));
    }
    public static void test4(int x,int y , boolean yn) {
        System.out.println("x > y || !yn 计算结果"+(x > y || !yn));
    }
    public static void test5(int x,int y) {
        System.out.println("y != ++x ? x : y 计算结果"+(y != ++x ? x : y));
    }
    public static void test6(int x,int y) {
        System.out.println("y++ / --x 计算结果"+(y++ / --x));
    }
}

输出结果

x + y * x-- 计算结果54
-x * y + y 计算结果-34
x < y && yn 计算结果true
x > y || !yn 计算结果false
y != ++x ? x : y 计算结果4
y++ / --x 计算结果8

解析

运算符的优先级

既然结果已经出来了,我们当然是要看一下为什么会是这样的结果。下图是百度百科中的一张运算符优先级图。

image
  • 优先级1级为最高优先级
  • 结合性是指运算符结合的顺序,通常都是从左到右。
没有自身元素操作的运算

对比优先级就可以解释这些没有对自身元素进行操作的比较结果了

-x * y + y 计算结果-34
x < y && yn 计算结果true
x > y || !yn 计算结果falsey++ / --x 计算结果8
带有自身操作的简单运算

而对于这样的一个y++ / --x 计算结果8表达,我们要知道两点

  • ++ -- 的运算优先级大于/
  • ++ -- 出现在前面,自身先自增1在计算,在后边则反之。

所以实际计算的是int型的17/2(int类型计算的精确度)

带有自身运算的多次取值问题

最后就是这两个计算了,也是比较迷惑性的计算

y != ++x ? x : y 计算结果4

x + y * x-- 计算结果54

对于三目运算符,我们可以理解成if else语句就好了,为真返回第一个,为假返回第二个值。

当++ -- 操作自身元素时,计算表达式是什么时候将内存中的值取出来计算的。

这也是为什么造成y != ++x ? x : y 计算后,取到的值为4,而x + y * x--计算时第一个x为3,不为2的原因。

我们写这样的一个测试

    public static void main(String[] args) {
        int x = 3;
        System.out.println("x + x++ = "+ (x + x++));
        x = 3;
        System.out.println("x++ + x = " + (x++ + x));
    }

结果

x + x++ = 6
x++ + x = 7

从结果来看,等于6是因为第一个x取到的值是3,第二个取到的值仍然是3(++在后先取出x值,x再自增1).而等于7的是x++取到值后,x自增1重新复制给x,所以第二次取到的就是4,答案就是7了,由此就可以解释x + y * x-- 计算结果54的结果为什么是54了。

最后

x = 3;
y = 17;

y != ++x ? x : yy != x++ ? x : y 的计算结果会一样吗?

    public static void main(String[] args) {
        int x = 3;
        int y = 17;
        System.out.println("y != ++x ? x : y = "+ (y != ++x ? x : y));
        x = 3;
        y = 17;
        System.out.println("y != x++ ? x : y =" + (y != x++ ? x : y));
    }

先自己算一下结。

答案是:

y != ++x ? x : y = 4
y != x++ ? x : y =4
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。