遗留Java语法

遗留Java语法,java,legacy,Java,Legacy,在阅读时,我在第16页的一个关于变量命名约定的示例中看到了这一点: int i; char *cp; float myWidth; 第二个声明很有意思——在我看来,它很像在C中声明指针的方式。在Java 8下编译时,它给出了一个语法错误 只是出于好奇:这是有效的语法吗?如果是,那是什么意思?我想这是复制粘贴错误 从JLS 1(这真的不是那么容易找到!)中,关于声明的部分指出,这种声明本质上是一个后跟标识符的类型。请注意,没有关于*的特别参考,但有关于[]的特别参考(针对阵列) char是我们的

在阅读时,我在第16页的一个关于变量命名约定的示例中看到了这一点:

int i;
char *cp;
float myWidth;
第二个声明很有意思——在我看来,它很像在C中声明指针的方式。在Java 8下编译时,它给出了一个语法错误


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

我想这是复制粘贴错误

从JLS 1(这真的不是那么容易找到!)中,关于声明的部分指出,这种声明本质上是一个后跟标识符的类型。请注意,没有关于
*
的特别参考,但有关于
[]
的特别参考(针对阵列)

char
是我们的类型,所以剩下的唯一可能性是
*cp
是一个标识符。美国

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

并指出:

当且仅当字符是Java字母时,才将其视为Java字母 字母()或是美元符号字符“$”(
\u0024
)或 下划线(“低线”)字符“uu”(
\u005F

所以
foo
\u-foo
$foo
都很好,但是
*foo
从来都是无效的



如果您想获得更为最新的Java样式指南,可以说这是最常被引用的文档。

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

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

if (c++ = d++) { // AVOID! Java disallows.
    …
}
无论如何,告诉程序员避免语法错误是没有意义的,因此我们可以从中得出的唯一结论是,文档不是100%特定于Java的

另一种可能是它是整个java系统的编码风格,包括JRE和JDK的C++部分。 注意,Sun甚至在Oracle出现之前很久就放弃了编码风格文档。他们限制自己指定语言是什么,而不是如何使用它。

无效语法

这只是一个复制/粘贴错误

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


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

是的,这是C-一定是复制/粘贴错误。这从来都不是有效的语法欢迎使用StackOverflow!我向你致敬——阅读文档的人!但是,例如C++中,<代码> */COD>是类型说明符的一部分,不是标识符。我不希望C++标识符在标识符部分提到“代码> */CODE”。“DaMiNeNeth-UnBeliVetrue是这样的,但是假设示例列表<代码> char *CP <代码>,<代码> char < /C> >必须是一个类型(因为它是关键字),所以<代码> *CP/<代码>必须是一个标识符(按每个)。不可能在规范中指出一点,即
*
没有特殊意义(除了作为乘法运算符),因此不可能引用它。甚至追溯到更久远的时间,该规范也没有(明确地)提到
*
和指针。@Marco13:这是一篇有趣的阅读。我不知道Oak支持契约式设计,支持统一访问。此外,对于用于从网络运行不受信任代码的语言来说,具有访问限制的公钥签名包看起来很有趣。有趣的是,您仍然可以获得JLS 1.0的打印版本(ISBN-10:0201634511)-