假设在C中,我有以下代码:
i=5 \
+6;
如果我打印i
,它会给我11。
我不明白上面的代码是如何正确执行的。乍一看,由于无法识别的令牌\
,我猜测它是编译器错误。有人可以解释这个逻辑吗?它与最大的蒙克逻辑有关吗?
答案 0 :(得分:10)
行末尾的反斜杠告诉编译器忽略换行符。
这是一种在不中断源文本的情况下将行格式化为人类可读的方法。例如,如果您的长字符串用引号括起来,则可以使用反斜杠在新行上继续字符串,而不在字符串中插入换行符。
(在C标准添加相邻字符串(例如"abc" "def"
)的属性之前,这更有用。现在你可以将字符串放在连续的行上,它们将被连接起来。在此之前,你不得不用反斜杠来做。)
现在,正如heretolearn指出的那样,反斜杠的最常见用法是继续预处理器宏定义。与常规C语句不同,预处理程序语句必须在一行上。但是,一些预处理器宏定义很长。为了(稍微)格式化它们,定义分布在多个物理行上,但反斜杠使它们成为编译器的一行(包括预处理器)。
编译器从源文本中删除了反斜杠后跟换行符,完全,与新行字符本身不同。所以源文本:
abc\
def
等同于单个标识符abcdef
,而不是abc def
。您可以在任何运算符或其他语言构造的中间使用它,除了三字形序列(三字符序列,如??=
)在反斜杠 - 换行之前转换为替换字符,例如#
处理):
MyStructureVariable-\
>MemberName
IncrementMe+\
+
然而,不要这样做。合理使用它。
答案 1 :(得分:1)
在一行末尾转义换行符的做法确实是为了将语句的继续标记到下一行。显然,在旧的C编译器中需要它只有一个我确定它仍然需要的地方,那就是函数的宏定义,这在C ++中通常是不受欢迎的。
续行是以反斜杠结尾的行。该 反斜杠被删除,以下行与当前连接 一。没有插入空格,因此您可以在任何地方拆分一条线,即使在 一句话的中间。 (分割线通常更具可读性 只在白色空间。)
连续线上的尾部反斜杠通常被称为 反斜杠换行符。
如果反斜杠与行尾之间有空格, 这仍然是一个持续的路线。但是,这通常是结果 一个编辑错误,许多编译器不会接受它作为一个 接下来,GCC会警告你。