4

假设在 C 中,我有以下代码:

i=5 \    
+6;  

如果我打印i,它会给我 11。

我不明白上面的代码是如何正确执行的。乍一看,我猜是因为 unrecognized token 导致编译器错误\。有人能解释一下逻辑吗?它与最大咀嚼逻辑有关吗?

4

2 回答 2

12

行尾的反斜杠告诉编译器忽略换行符。

这是一种在不中断源文本的情况下将行格式化为人类可读的方法。例如,如果您有一个用引号括起来的长字符串,您可以使用反斜杠在新行中继续该字符串,而无需在字符串中插入换行符。

(这在C标准添加相邻字符串连接的属性之前更有用,例如"abc" "def",连接。现在您可以将字符串放在连续的行上,它们将被连接。在此之前,您必须使用反斜杠来做到这一点.)

正如heretolearn 所指出的,如今反斜杠最常见的用途是继续预处理器宏定义。与常规 C 语句不同,预处理器语句必须位于一行。但是,一些预处理器宏定义很长。为了更好地格式化它们(有点),定义分布在多条物理行上,但是反斜杠使它们成为编译器(包括预处理器)的一行。

编译器将后跟换行符的反斜杠从源文本中完全删除,这与换行符本身不同。所以原文:

abc\
def

相当于单标识符abcdef,不是abc def。您可以在任何运算符或其他语言构造的中间使用它,除了三元序列(三元序列,例如,在反斜杠换行处理之前??=转换为替换字符,例如):#

MyStructureVariable-\
>MemberName

IncrementMe+\
+

但是,不要那样做。合理使用。

于 2013-10-21T13:25:15.713 回答
2

在行尾转义换行符的做法确实是将语句的延续标记到下一行。显然,在旧的 C 编译器中需要它。我确信只有一个地方仍然需要它,那就是在函数的宏定义中,这在 C++ 中通常是不受欢迎的。

续行是以反斜杠结尾的行,. 反斜杠被删除,以下行与当前行连接。没有插入空格,因此您可以在任何地方分割一行,甚至在一个单词的中间。(通常只在空白处分割行更具可读性。)

连续行上的尾随反斜杠通常称为反斜杠换行符。

如果反斜杠和行尾之间有空格,那仍然是续行。但是,由于这通常是编辑错误的结果,并且许多编译器不会接受它作为续行,所以 GCC 会警告您。

参考

于 2013-10-21T13:29:05.077 回答