是否首先评估数组索引或指定值?

 PHP大傻子 发布于 2023-02-13 12:45

如果我有以下代码:

array[index] = someValue;

请问someValueindex会首先评估?

2 个回答
  • 看起来index首先评估表达式.

    该测试程序证实了这一点:

    public class Main {
       public static void main(String[] args) {
          int[] array = new int[10];
          array[getIndex()] = getValue();
       }
    
    
       private static int getIndex() {
          System.out.println("getIndex!");
          return 0;
       }
    
       private static int getValue() {
          System.out.println("getValue!");
          return 1;
       }
    }
    

    输出:

    getIndex!
    getValue!
    

    即使ArrayIndexOutOfBoundsException抛出一个值,也会评估该值.改变getIndex():

    private static int getIndex() {
       System.out.println("getIndex!");
       return -1;  // Hey!
    }
    

    输出:

    getIndex!
    getValue!
    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
        at Main.main(Main.java:11)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at com.intellij.rt.execution.application.AppMain.main(AppMain.java:90)
    

    2023-02-13 12:46 回答
  • 首先评估索引.见JLS第15.26.1节,特别是:

    15.26.1.简单的赋值运算符=

    ...

    如果左侧操作数是一个数组访问表达式(第15.13节),可能包含在一对或多对括号中,则:

      首先,评估左侧操作数数组访问表达式的数组引用子表达式.如果此评估突然完成,则赋值表达式出于同样的原因突然完成; 不评估索引子表达式(左侧操作数数组访问表达式)和右侧操作数,也不进行赋值.

      否则,将评估左侧操作数数组访问表达式的索引子表达式.如果此评估突然完成,则赋值表达式会出于同样的原因突然完成,并且不会评估右侧操作数并且不会进行赋值.

      否则,将评估右侧操作数.如果此评估突然完成,则赋值表达式会出于同样的原因突然完成,并且不会发生任何分配.

    TL; DR:顺序为1 [2] = 3

    2023-02-13 12:46 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有