加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 表达式与运算符优先级的从左到右的评估.为什么从左到右

发布时间:2020-12-15 04:38:02 所属栏目:Java 来源:网络整理
导读:考虑以下代码: public class Incrdecr {static int x = 3;static int y = ++x * 5 / x-- + --x;public static void main(String[] args){ System.out.println("x is " + x); System.out.println("y is " + y);} 它评估如下: x is 2y is 7 这很有道理,但让
考虑以下代码:

public class Incrdecr {

static int x = 3;
static int y = ++x * 5 / x-- + --x;

public static void main(String[] args){

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

它评估如下:

x is 2
y is 7

这很有道理,但让我们快速查看运算符优先级表:

enter image description here

据此,应该首先评估后缀运算符.现在,如果我们回到我们的代码,我们将看到x–应该首先被评估,但事实并非如此.我不记得什么?

换句话说,如果我们严格遵循运算符优先级表,那么表达式将计算为:

y = x * 5/3 –x;

当然,这给了我们一个完全不同的结果.

解决方法

你的表达从左到右评估是正确的.这是Java中的一般评估顺序(可能有例外).

我想你已经弄清楚到底发生了什么:

> x从3递增到4,并取新值4
> 5被评估为5
> 4 * 5 = 20
> x,4的值用于除法;除法得到5,x递减到3.
> x在进行最终加法的值之前进一步递减到2,然后得到7.

除外:只有在可以保证结果相同的情况下,才允许编译器交换步骤.因此我们知道结果只能是7.

尝试将两个概念区分开来:评估顺序和运算符优先级.他们不一样.

优先表告诉你表达式被理解为((x)* 5 /(x–))( – x)(这大部分是好的,因为(x * 5 / x) – – x没有意义无论如何).

举一个不同的例子:f(x) – g(x)* h(x). mehtods从左到右调用:f(),然后g()和h()最后.优先表仅告诉您乘法在减法之前完成.

编辑:Lew Bloch在评论中质疑x在计算过程中的任何时候都会被评估为4.为了测试这个,我从问题中提出了以下程序变体:

public class Incrdecr {

    static int x = 3;
    static int y = p(++x) * 5 / p(x--) + p(--x);

    private static int p(int i) {
        System.out.println("p(): " + i);
        return i;
    }

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

这打印:

p(): 4
p(): 4
p(): 2
x is 2
y is 7

所以是的,在两点x被评估为4.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读