【问题标题】:Legacy Java Syntax旧版 Java 语法
【发布时间】:2019-03-12 20:06:29
【问题描述】:

阅读Java Code Conventions document from 1997,我在 P16 上关于变量命名约定的示例中看到了这一点:

int i;
char *cp;
float myWidth;

第二个声明很有趣——对我来说,它看起来很像在 C 中声明指针的方式。在 Java 8 下编译时会出现语法错误。

只是出于好奇:这曾经是有效的语法吗?如果有,那是什么意思?

【问题讨论】:

  • 是的,那是 C - 一定是复制/粘贴错误。
  • 这不是一个有效的语法
  • 欢迎来到 StackOverflow!我向你致敬 - 阅读文档的人!

标签: java legacy


【解决方案1】:

我想这是复制粘贴错误。

从 JLS 1 开始(真的不容易找到!),local variable declarations 部分指出,这种声明本质上是一个类型,后跟一个标识符。请注意,没有特别提到 *,但特别提到了 [](用于数组)。

char 是我们的类型,所以剩下的唯一可能就是*cp 是一个标识符。 section on Identifiers 状态

标识符是 Java 字母和 Java 的无限长度序列 数字,其中第一个必须是 Java 字母。
...
Java 字母是 Character.isJavaLetter (§20.5.17) 方法返回 true 的字符

the JavaDoc for that method 表示:

一个字符被认为是一个 Java 字母当且仅当它是一个 字母 (§20.5.15) 或美元符号字符 '$' (\u0024) 或 下划线(“低线”)字符“_”(\u005F)。

所以foo_foo$foo 没问题,但*foo 永远无效。


如果您想要更新的 Java 风格指南,Google's style guide 可以说是最常被引用的。

【讨论】:

  • 但在例如C++,*类型说明符 的一部分,而不是标识符。我不希望 C++ 规范在标识符部分提及*
  • @Damien_The_Unbeliever 是的,但鉴于示例列出了char *cpchar 必然是一个类型(因为它是一个关键字),所以*cp 必然是一个标识符(根据14.3 )。不可能在规范中指出 * 没有特殊含义(除了作为乘法运算符之外)的单个点,因此无法引用它。
  • 回到更早的时间,Oak Specification 也没有提到* 和指针(明确地)。
  • @Marco13:读起来很有趣。我不知道 Oak 支持 Design-by-Contract 并且它支持统一访问。此外,对于用于从网络运行不受信任的代码的语言来说,具有访问限制的公钥签名包看起来很有趣。
  • 有趣的是,您仍然可以获得 JLS 1.0 的印刷版 (ISBN-10: 0201634511) amazon.com/Java-TM-Language-Specification/dp/0201634511 - dl.acm.org/citation.cfm?id=560667
【解决方案2】:

这似乎是一个针对类 C 语言的通用编码风格文档,并添加了一些特定于 Java 的内容。例如,另请参阅下一页:

不要在容易与等式运算符混淆的地方使用赋值运算符。示例:

if (c++ = d++) { // AVOID! Java disallows.
    …
}

告诉程序员无论如何都要避免语法错误是没有意义的,所以我们可以从中得出的唯一结论是该文档不是 100% 特定于 Java 的。

另一种可能性是它被认为是整个 Java 系统的编码风格,包括 JRE 和 JDK 的 C++ 部分。

请注意,早在 Oracle 出现之前,Sun 就放弃了编码风格文档。他们限制自己指定语言,而不是如何使用它。

【讨论】:

    【解决方案3】:

    语法无效!

    这只是复制/粘贴错误。

    变量中的 Token (*) 仅适用于 C,因为它使用指针,而 JAVA 从不使用指针。

    而 Token (*) 在 JAVA 中仅用作运算符。

    【讨论】:

      猜你喜欢
      • 2017-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-12
      • 1970-01-01
      • 2019-07-16
      相关资源
      最近更新 更多