为什么Java中不起作用和不起作用的运算符优先级和关联性无法正常工作?

时间:2018-07-10 21:11:58

标签: java

++和-的运算符优先级高于+,并且具有从右到左的关联性。因此,我认为x的输出应为(++ i + 4,然后5 + 4)9,而y的输出应为(i +++ 5,然后5 + 5)10。对于这两者,其输出都为11。

class First {
    public static void main(String[] args) {
        int i = 5;
        int x = ++i + --i;
        int y = i++ + i--;
        System.out.println("x="+x);
        System.out.println("y="+y);
    }
} 

3 个答案:

答案 0 :(得分:3)

让我们翻译一下:

TRANSLATE

进入(逐步):

WITH cteFiles AS (SELECT 'File_20170902_Name.txt' AS FILENAME FROM DUAL UNION ALL
                  SELECT 'File200_Name_20170902_1.txt' AS FILENAME FROM DUAL UNION ALL
                  SELECT 'File400_20170902_Name_1.txt' AS FILENAME FROM DUAL UNION ALL
                  SELECT 'File1_name_20170902.txt' AS FILENAME FROM DUAL)
SELECT FILENAME, TRANSLATE(REGEXP_SUBSTR(FILENAME, '_[0-9]+[_.]'), '0123456789_.', '0123456789') AS FINAL_NUMS
  FROM cteFiles;

答案 1 :(得分:2)

关联性决定了如何解析具有same precedence的运算符。

例如,一元减号(- ...)和一元按位非(~ ...)运算符具有相同的优先级,并且具有right-to-left的关联性。因此:

int i = ~-1; // == 0
int j = -~1; // == 2

答案 2 :(得分:2)

Section 15.7 of the JLS对此很清楚:

  

Java编程语言保证运算符的操作数似乎按照特定的评估顺序(即从左到右)进行评估。

     

建议代码不要严格依赖此规范。当每个表达式最多包含一个副作用(作为其最外层的操作),并且当代码不完全依赖哪个表达式从左到右求值时会出现异常时,代码通常会更清晰。

每当将赋值运算符和其他二进制运算符与增量或减量运算符混合使用时,对表达式的评估就不是很直观,并且永远不要编写这种令人困惑的代码。

即使递增和递减一元运算符是从右到左的关联,表达式的值也会从左到右求值。

int x = ++i + --i;

在这里,++ii递增到6并返回6,然后--i递减i5并返回5,并且6和5之和为11。

int y = i++ + i--;

在这里,i++返回5并将i递增到6,然后i--返回6并递减i5,并且5和6之和为11。

使用这些表达式,从右到左的关联性不会计入操作顺序,因为关联性仅控制在 same 优先级的运算符中首先执行哪些操作。您之间有一个优先级较低的+运算符,因此此处的关联性无关紧要。