响水凹

欢迎来到 Guang-Wen Duan (Dennis Duan) 的个人 Wiki

用户工具

站点工具


computer:c:tips:end_of_line

行结束符(End-of-line)

行结束符(End-of-line)用来标记C源程序中一行源代码的结束,跟在该结束符后的第一个字符被认作下一行的第一个字符。

可以通过反斜杆(\)将多个源代码行合并成一个逻辑行,合并时反斜杆和之后的行结束符被删除。

合并工作发生在三元组处理(Trigraph processing)和多字节字符序列到源字符集转化之后,预处理(Preprocessing)和词法分析(Lexical analysis)之前。

例如,如下的代码:

        if (a == b) x =1; el\
se x = 2;

等价于:

        if (a == b) x =1; else x = 2;


上面提到了三元组,故附解释如下:

三元组(Trigraph)

有些国家和地区的字符集不足以囊括ASCII字符,故标准C引入三元组来表示如下的字符:

三元组 代表字符
??( [
??) ]
??< {
??> }
??/ \
??! |
??' ^
??- ~
??= #

只有上述9个三元组被识别,其他类似的字符组合不会被转化。

三元组字符的转化在词法分析(Lexical analysis)和识别字符(串)常量中的转义字符(Escape characters)之前进行。

如果一个字符序列刚好与三元组相同,要避免识别为三元组,要使用\转义其中的至少一个字符。如What?\?!,等于What??!。

要表示一个\,由于\本身是转义字符,需要两个\来表示,即??/??/。

替代符号(Alternative punctuators)

与三元组类似,有些字符集中的操作符(Operator)和标点(Punctuator)也有替代形式:

符号 代表符号
<% {
%> }
<: [
:> ]
%: #
%:%: ##

与三元组不同在于,这些符号在字符(串)常量中不会被识别。

例如,下面的有点怪异的程序:

#include <stdio.h>
int main(void)
<%
        char str<:20:> = "Hello, World!";
        printf("%s\n", str);
%>

等价于:

#include <stdio.h>
int main(void)
{
        char str[20] = "Hello, World!";
        printf("%s\n", str);
}

实际应用中很少会碰到此类特殊符号,除非万不得已,一般不应该刻意使用它们。

computer/c/tips/end_of_line.txt · 最后更改: 2014/11/01 02:02 由 127.0.0.1