【问题标题】:Why do Java array declarations use curly brackets?为什么 Java 数组声明使用大括号?
【发布时间】:2011-07-14 16:48:45
【问题描述】:

我想知道为什么 Java 数组声明使用大括号而不是标准括号。如此处所示。我想这可能需要进一步了解大括号,但这特别是我现在的议程。

Object[] tableHeaders = {"Cars","Trucks","Tacos"};

这是正确的,而不是。

Object[] tableHeaders = ("Cars","Trucks","Tacos");

【问题讨论】:

  • 如果您正在寻找 James Gosling 的官方理由,我认为您不走运。它或多或少是数学世界的标准。我认为这个问题没有明确的答案。
  • @yock - 大括号如何成为“数学世界的标准”?在通常的数学符号中,大括号表示(无序的)集合,而(有序的)序列由括号括起来。
  • 我还想知道为什么数组没有像Object[] ar=["Cars", "Trucks", "Tacos"]; 那样声明。对于您答案的第一部分“为什么?”以吸引更多具有“C”编程背景的人进行初步开发。我确信詹姆斯·高斯林就是其中之一。一般来说,您可以省略对花括号的进一步理解,因为编译器会根据状态解析语言。
  • 只是从维基百科中获取线索。 en.wikipedia.org/wiki/Set_(mathematics)

标签: java arrays declaration curly-braces


【解决方案1】:

花括号通常表示集合和集合,而括号通常表示类 C 语言中的参数。

很久以前,人们已经习惯了this kind of convention with C。我很确定它在 Java 中以这种方式工作,以保持与旧语言的某种语法一致性。

【讨论】:

  • 是的,这正是数组初始化的 C 语法:char const * tableHeaders[] = {"Cars","Trucks","Tacos"}; 我确信这比其他任何事情都重要。
  • 这绝对是受 C 的启发。但是数组是序列(顺序很重要),而不是集合或集合。在大多数数学符号系统中,序列通常由括号分隔。
【解决方案2】:

我不能说为什么 James Gosling 等人选择了这个特殊的替代方案......

但是,使用圆括号代替大括号会给 Java 语法带来严重的歧义问题。考虑以下示例:

Object[] tableHeaders = ("Cars");

圆括号是否表示数组构造函数,或者它们是正常表达式表达式语法的一部分?

现在有可能想出一些复杂的优先规则来解决这个问题,但这让程序员和编译器编写者的日子都不好过。

(在语法层面,Java 解析器需要处理以下方面的歧义:

VariableInitializer:
    ArrayInitializer
    Expression

在上面的示例中,("Cars") 匹配 ArrayInitializer 和 Expression 产生式...如果您使用圆括号作为数组初始值设定项。确定哪个是正确的含义需要查看声明的变量类型……然后是对 VariableInitializer 的上下文敏感解析。讨厌。)

我想说他们在数组初始化器中不使用圆括号是正确的选择。


方括号也不起作用。考虑尝试解释这一点...

... = new Object[]["Cars"];  // 1-D array

对比

... = new Object[21][];      // 2-D array

... = new Object[][];        // is that 1-D or 2-D?

【讨论】:

    【解决方案3】:

    在大多数基于 Algol 的编程语言(使用最广泛的语言)中,数组使用花括号声明。

    【讨论】:

    • 您的意思是在大多数受 Algol 启发的语言中。不在 Perl、Fortran、Cobol、Lisp 中......
    猜你喜欢
    • 2010-11-09
    • 2018-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-30
    • 1970-01-01
    相关资源
    最近更新 更多