为什么在c++ /Java和类似的语言中用美元符号开始变量名是不好的?
Why is it bad to start a variable name with a dollar sign in C++/Java and similar?
为什么在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创建的。此外,在大多数操作系统中,$符号用于环境变量,因此它会令人困惑,并可能干扰系统定义的变量。
- 当回溯以零开始时,如何调试崩溃
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 将无符号char*转换为std::istream*C++
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- vscode g++链路故障:体系结构x86_64的未定义符号
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 使用gcc从静态链接的文件中查找可选符号
- C++中无符号字符溢出
- 使用无符号字符数组有效存储内存
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- VC++本机单元测试,找不到调试符号
- 为什么我必须在C++中添加一个赋值符号来声明一个数组
- 检查TCHAR数组输入是否为带符号整数C++
- 用符号版本替换对函数的所有调用
- 未解析的外部符号_MsiLocateComponentW@12.
- 错误:调用"开始(常量无符号 int&)"没有匹配函数|
- 为什么在c++ /Java和类似的语言中用美元符号开始变量名是不好的?