转义字符(\)背后的魔力是什么?

6

C/C++编译器如何处理源代码中的转义字符["\]?编译器语法如何编写以处理该字符?遇到该字符后,编译器会执行什么操作?


至少请尽力正确拼写您创建的标签... - Gilles
抱歉,问题是匆忙输入的。 - Mahesh
你的问题中缺少这个字符(?)。 不过,有什么急事吗? - Adriano Varoli Piazza
因为有紧急会议,所以在回答问题时打字有些匆忙。感谢您的修改 :) - Mahesh
1
有人愿意评论一下为什么这个问题被推到下面吗?我有什么遗漏的吗?对我来说,这似乎是一个公正和正确的问题。 - David Rodríguez - dribeas
也许我来晚了,但我并没有看到这个问题被推下去。 - Henry B
4个回答

14

大多数编译器都分为两个部分:编译器前端被称为词法分析器或扫描器。编译器的这一部分读取实际字符并创建标记。它具有状态机,可以决定在看到转义字符时,它是真实的(例如,在字符串内部出现)还是修改下一个字符。相应地,标记作为转义字符或其他标记(例如制表符或换行符)输出到编译器的下一部分(解析器)。状态机可以将多个字符组合成一个标记。


6
这个主题有趣的一点是《关于信任的信任》[PDF链接]
该论文描述了编译器如何精确处理此问题的一种方式,展示了用C语言编写的编译器没有将代码明确转换为ASCII值的情况;以及如何在编译器中引导新的转义码,以便对于新代码的ASCII值的理解也是隐含的。

这是一篇非常有趣的论文,我有一段时间没有读过了。我忘记了关于引导编译器以理解新的转义字符序列(例如'\v')的部分 - 所以我没有立即看到它的相关性。我很高兴去查看它。 - Jonathan Leffler

2

通常,它会忽略以下字符:

  • 在字符串文字或字符文字中,它表示转义下一个字符。\a 表示 'alert'(闪烁终端,哔哔声或其他),\n 表示“换行符”,\xNUM 表示十六进制数字。
  • 如果它是换行符前的最后一个可见字符,无论是否在字符串内(甚至在单行注释内!),它都作为行连续符:将忽略以下换行符,并将下一行与当前行合并。

在C99中不要忘记\uXXXX和\UXXXXXXXX。 - Jonathan Leffler
\NNN(其中N是0-7的数字)表示八进制字节号。 \0通常被称为Null-Terminator,实际上与\000相同。我认为255是\377。 - abelenky
对的,Aaron。\ 还有其他用途。我想列出最重要的几个(通过主观衡量)。 - Johannes Schaub - litb

1

带有后续字符的转义字符(如\n)对于C编译器来说是单个字符 - 扫描器将其呈现给解析器作为字符标记,因此解析器中不需要特殊的语法规则来处理转义字符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接