C语言的结构

时间:2011-09-30 16:27:28

标签: c syntax grammar

为什么这样做

printf("Hello"
"World");

尽管

printf("Hello
""World");

没有? ANSI C连接相邻的字符串,没关系......但这是另一回事。 这与C语言解析器有什么关系吗? 感谢

3 个答案:

答案 0 :(得分:7)

字符串必须在行尾之前终止。这是一件好事。否则,忘记的close-quote可能会阻止后续的代码行执行。

这可能需要花费大量时间进行调试。这些天语法着色将提供线索,但在早期有单色显示。

答案 1 :(得分:1)

您无法在字符串文字中创建新行。这是一个选择,我的C. IMO的设计师,这是一个很好的功能。 但是你可以这样做:

printf("Hello\
""World");

给出相同的结果。

答案 2 :(得分:1)

C语言是根据标记定义的,其中一个标记是字符串文字(在标准中: s-char-sequence )。 s-char-sequences以未转义的双引号开头和结尾,不得包含未转义的换行符。

相关标准(C99)引用:

> Syntax
>   string-literal:
>     " s-char-sequence(opt) "
>     L" s-char-sequence(opt) "
>   s-char-sequence:
>     s-char
>     s-char-sequence s-char
>   s-char:
>     any member of the source character set
>           except the double-quote ", backslash \,
>           or new-line character
>     escape-sequence

然而,在称为行拼接的早期转换阶段中删除了转义的换行符,因此编译器永远不会解释它们。这是相关标准(C99)的引用:

翻译语法规则的优先级由以下阶段指定。

  1. 物理源文件多字节字符以实​​现定义的方式映射到源字符集(如果需要,引入行尾指示符的换行符)。 Trigraph序列由相应的单字符内部表示替换。
  2. 删除反斜杠字符(\)后面紧跟一个新行字符的每个实例,拼接物理源代码行以形成逻辑源代码行。只有任何物理源线上的最后反斜杠才有资格成为此类拼接的一部分。非空的源文件应以换行字符结尾,在进行任何此类拼接之前,该字符不应立即以反斜杠字符开头。
  3. 源文件被分解为预处理标记6)和序列 空格字符(包括注释)。源文件不得以a结尾 部分预处理令牌或部分注释。每条评论都被替换为 一个空格字符。保留换行符。是否每个都是空的 新行以外的空格字符序列被保留或替换为一个空格字符是实现定义的。
  4. 执行预处理指令,扩展宏调用,以及 _Pragma一元运算符表达式被执行。如果是一个字符序列那个 匹配通用字符名称的语法由token生成 连接(6.10.3.3),行为未定义。 #include预处理 指令导致从阶段1处理命名的头文件或源文件 通过阶段4,递归。然后删除所有预处理指令。
  5. 字符常量和字符串文字中的每个源字符集成员和转义序列都将转换为执行字符集的相应成员;如果没有相应的成员,则将其转换为除null(宽)字符以外的实现定义成员.7)
  6. 连接相邻的字符串文字标记。
  7. 分隔标记的空白字符不再重要。每 预处理令牌转换为令牌。由此产生的代币是 语法和语义分析并翻译为翻译单位。
  8. 解析所有外部对象和函数引用。链接库组件以满足对当前转换中未定义的函数和对象的外部引用。所有这些翻译器输出都被收集到一个程序映像中,该映像包含在其执行环境中执行所需的信息。