【问题标题】:What is the use of backslash in C program initialization?C程序初始化中反斜杠有什么用?
【发布时间】:2017-10-05 15:05:34
【问题描述】:
  1. 没有反斜杠

    unsigned char a=5;
    
  2. 带反斜杠

    unsigned char a=\
    5;
    

鉴于两者的工作方式相同,那么反斜杠的实际用途是什么?

【问题讨论】:

  • 它告诉预处理器连接两行。但 C 不介意将这两行分开。
  • 你试过在搜索引擎上搜索这个吗?
  • 新行前面的斜线表示它应该被视为一行。我认为这种类型的语句没有必要,但在处理多行预处理器宏时经常看到
  • @babon:给定反斜杠,搜索起来很麻烦。
  • @JonathanLeffler 同意。但是用标题搜索-“c程序中反斜杠的用途是什么”会更容易:)

标签: c syntax escaping


【解决方案1】:

行尾的\ 字符表示下一行应视为上一行的延续。

由于允许在赋值 (=) 运算符后使用空格,因此在这种情况下没有意义。

【讨论】:

  • 重要的是要注意 预处理器 执行此操作。它没有在 C 中定义,但 C 编译器永远不会看到它,因为预处理器将其处理掉了。
  • @PaulOgilvie:但行为由 C 标准在第 5.1.1.2 节第 1 段第 2 小点中明确定义。(根据许多解释,这不是“预处理器”的一部分,因为这通常被理解为在同一段落中仅实现第 4 阶段。无论如何,这也是 C 标准的一部分。)
  • @rci,至少在第 5 点之前,该部分是关于“预处理翻译单元”的。
【解决方案2】:

C 标准这样描述程序翻译的第二阶段:

5.1.1.2 翻译阶段

...

  1. 每个反斜杠字符 (\) 的实例都被删除,紧跟一个换行符,将物理源代码行拼接成逻辑源代码行。只有任何物理源行上的最后一个反斜杠才有资格成为此类接头的一部分。非空源文件应以换行符结尾,在进行任何此类拼接之前,该换行符之前不应紧跟反斜杠字符。

因此,发布的 2 个代码片段之间没有语义差异。这些反斜杠换行序列也可以出现在标记的中间:

\
u\
ns\
ign\
ed c\
har a\
 = 5;/\
/comment

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 2016-03-12
    • 2013-10-24
    • 2019-01-28
    • 2011-06-14
    • 2018-07-19
    相关资源
    最近更新 更多