c - 为什么C中标识符可以包含 '$'?

标签 c

<分区>

最近看到这样的代码:

int $ = 123;

那么为什么 '$' 可以出现在 C 中的标识符中?

在C++中也是一样吗?

最佳答案

这不是好的做法。通常,您应该只在标识符中使用字母数字字符和下划线 ([a-z][A-Z][0-9]_)。

表面水平

与其他语言(bash、perl)不同,C 不使用$ 来表示变量的用法。因此,它在技术上是有效的。从 C++ 17 开始,这是符合标准的,请参阅草案 n4659。在 C 中,它很可能属于 C11,6.4.2。这意味着现代编译器似乎确实支持它。

至于你的C++问题,让我们测试一下吧!

int main(void) {
    int $ = 0;
    return $;
}

在 GCC/G++/Clang/Clang++ 上,这确实可以编译并运行得很好。

更深层次

编译器获取源代码,将其词法化为 token 流,将其放入抽象语法树 (AST),然后使用它来生成代码(例如汇编/LLVM IR)。您的问题实际上只围绕第一部分(例如词法分析)。

C/C++ 的语法(因此词法分析器实现)不将 $ 视为特殊的,不像逗号、句点、瘦箭头等...因此,您可能会从下面的 C 代码中的词法分析器是这样的:

int i_love_$ = 0;

在词法分析器之后,这变成了这样的 token 流:

["int", "i_love_$", "=", "0"]

如果您在哪里获取此代码:

int i_love_$,_and_.s = 0;

词法分析器会输出如下 token 流:

["int", "i_love_$", ",", "_and_", ".", "s", "=", "0"]

如您所见,由于 C/C++ 不将 $ 等字符视为特殊字符,因此它的处理方式与其他字符(如句点)不同。

关于c - 为什么C中标识符可以包含 '$'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68334043/

相关文章:

c - 指向 ROM 中函数的指针

c++ - 将文本添加到 jpeg

c - 信号处理程序是在内核空间还是用户空间运行?

c - HAL_UART_Transmit_IT 如何在 STM32F091VB 上管理串行发送数据

c - 如何在C中以90度的增量旋转bmp图像?

c - 为什么这个排序功能不起作用? C

在 bash 脚本中检查 C 程序的返回值?

c++ - 使用 printf 打印 size_t 的正确方法是什么?

c - GtkFileChooserButton 中的 SIGSEGV

c - 关于结构体指针及其工作原理