为什么在c++ /Java和类似的语言中用美元符号开始变量名是不好的?

Why is it bad to start a variable name with a dollar sign in C++/Java and similar?

本文关键字:开始 符号 变量名 美元 语言 c++ Java 为什么      更新时间:2023-10-16

为什么在c++/Java和类似的PHP中以美元符号开始变量名是不好的?

编辑:有风险吗?

在Java中,在变量中使用$是合法的,但绝对是一个坏主意。

如果您这样做,就有可能意外地使用与编译器本身或某些代码生成器使用的名称冲突的名称。结果将是意想不到的编译或运行失败,这可能特别难以诊断……

还有一个潜在的风险,您(错误地)使用$将在Java的未来版本中导致问题。Java编译器/运行时对$的使用可能会在将来改变,导致你的滥用代码失败。

别这么做。或者至少,不要这样做,除非你正在编写一个生成器……,你知道你会给自己带来什么

在c++中是不可移植的。标准规定([lex.name]节)必须接受的唯一字符是大写字母、小写字母和下划线作为标识符的开头。

Java允许美元符号作为标识符的开始,但是建议它只用于机械生成的代码。(看到)

在c++标识符中似乎可以使用美元符号作为扩展,但它不是标准的一部分。

在Java中,$用于内部类名,也可能用于一些"合成"方法名。基本上,编译器为处理内部类而生成的任何代码都将在其中包含$。因为这个原因,使用$至少会令人困惑。一般来说,您不需要在Java的变量/方法/类名中看到$。

java from this post

然而,约定是always变量名以字母,不是"$"或"_"。此外,美元符号字符,by惯例,从来没有被使用过。你可能会发现一些情况在哪里自动生成的名称将包含美元符号,但是变量名应该避免使用它。一个类也存在类似的约定下划线字符;虽然它的从技术上讲是合法的变量的名称为"_",这不鼓励实践。

我认为没有任何风险/副作用;这是不鼓励的。

因为JLS 8 3.8这么说:

$符号应该只在机械生成的源代码中使用,或者很少用于访问遗留系统上已有的名称。

你真的可以生成编译失败的代码,例如在Oracle JDK 1.8.0_45上:

public class Assert {
    static final boolean $assertionsDisabled = false;
    public static void main(String[] args) {
        assert System.currentTimeMillis() == 0L;
    }
}

问题是javac生成了一个字段$assertionsDisabled来实现assert,这与我们的字段冲突。

参见:https://stackoverflow.com/a/29439538/895245

因为在c++和Java中这样做会导致语法错误(在c++的情况下)或不良风格(在Java的情况下)。这两种语言都不需要这样指示变量,这样做是错误的。以特殊字符(如'$')开始变量对于语言系统(这对于像PHP这样的解释性语言很重要)来说容易得多,但对于程序员来说却困难得多,因为他们必须输入所有这些'$'字符。所以大多数语言(甚至大多数解释语言)都不需要它们

我能想到的主要原因如下:在Java中,内部类名是用$ sign创建的。此外,在大多数操作系统中,$符号用于环境变量,因此它会令人困惑,并可能干扰系统定义的变量。