使用前缀增量运算符和括号优先级澄清数学表达式

时间:2019-01-05 09:01:56

标签: java math operator-precedence associativity

给出以下代码:

int p,k=8;
p=k*(++k-8);
System.out.println(p);

++k被求k=9时,然后变成k*(9-8)给出9*1

int p,k=8;
p=(++k-8)*k;
System.out.println(p);

但这给出9作为输出

3 个答案:

答案 0 :(得分:5)

您与

相乘
left side:  k  
right side: (++k-8)

正如您正确指出的那样,大括号优先。但是,您的程序仍然“从左到右”运行。因此,首先评估左侧,即k = 8。然后评估右边,即(++k-8) = 1。 现在我们已经确定了双方,可以将它们相乘:8*1 = 8

答案 1 :(得分:1)

这是您的代码编译的类文件:

   int k = 8;
    byte var10000 = k;
    int k = k + 1;
    int p = var10000 * (k - 8);
    System.out.println(p); 

答案 2 :(得分:-1)

似乎您的IDE首先正在评估括号内,该括号使k递增(8-> 9),然后将结果(1)与递增的k(9)相乘。

正如其他用户所说的,情况并非如此,您的环境中可能存在错误。

使用++ k时,k本身应保留为k,并且仅在当前代码行的末尾递增。

来自Java文档的增减演示代码

$ awk '
{
    split($2,a,":")                         # separate hs, ms and sses
    b[$1]+=a[1]*3600+a[2]*60+a[3]           # sum them up as as seconds
}
END { 
    for(i in b) {
        h=int(b[i]/3600)                    # separate hs
        m=int((b[i]-3600*h)/60)             # and ms
        s=b[i]-3600*h-60*m                  # and sses
        printf "%s %d:%02d:%02d\n",i,h,m,s  # output
    }
}' file
alibab 240:00:00
amazon 73:02:00
ebay 5:00:00