我是C语言的初学者,我在玩C语言。我输入了一个C代码,如下所示:

#include <stdio.h>
int main()
{
    printf("hello world\n");
    \
    return 0;
}

即使我故意使用了\,c编译器也不会抛出任何错误。这个符号在C语言中是用来做什么的?
编辑:
即使这样:
"\n";

最佳答案

序列反斜杠换行在转换过程的早期阶段(阶段2)从代码中删除。它过去是在字符串连接之前创建长字符串文本的方式,现在仍然是在多行上扩展宏的方式。
参见第5.1.1.2节C99标准的翻译阶段:
翻译的语法规则之间的优先顺序如下
阶段5)
在定义的实现中映射物理源文件多字节字符
方式,到源字符集(为
如有必要。三角图序列替换为
对应的单字符内部表示。
紧跟新行的反斜杠字符(\)的每个实例
删除字符,拼接物理源行以形成逻辑源行。
只有任何物理源行上的最后一个反斜杠才有资格成为部分
这样一个接头。非空的源文件应以新行字符结尾,
在任何该等
进行拼接。
源文件被分解为预处理标记6)和
空白字符(包括注释)。源文件不应以
部分预处理标记或在部分注释中。每条评论都被替换为
一个空格字符。保留新行字符。是否每个非空
保留或替换新行以外的空白字符序列
一个空格字符是实现定义的。
执行预处理指令,展开宏调用,以及
_Pragma执行一元运算符表达式。如果一个字符序列
匹配由令牌生成的通用字符名的语法
连接(6.10.3.3),行为未定义。a#include预处理
指令导致从阶段1处理命名头或源文件
递归地通过第4阶段。然后删除所有预处理指令。
字符常量中的每个源字符集成员和转义序列
字符串文本转换为执行字符的相应成员
set;如果没有对应的成员,则转换为定义的实现
非空(宽)字符的成员。7)
相邻的字符串文本标记被连接起来。
分隔标记的空白字符不再有意义。每个
预处理令牌被转换为令牌。生成的标记是
从句法和语义上分析并翻译为一个翻译单元。
所有外部对象和函数引用都被解析。库组件是
链接以满足对中未定义的函数和对象的外部引用
当前翻译。所有这样的翻译输出都被收集到一个程序图像中
它包含在其执行环境中执行所需的信息。
5)实施应表现为这些单独的阶段发生,即使许多阶段在实践中通常被折叠在一起。
6)如6.4所述,将源文件的字符划分为预处理标记的过程是
上下文相关。例如,请参阅<预处理指令中对#include的处理。
7)一个实现不需要将所有非对应的源字符转换为同一个执行
性格。
如果在离谱的反斜杠后面有一个空白字符或任何其他字符,则会出现编译错误。我们可以看出,在它之后没有任何内容,因为您没有编译错误。
你问题的另一部分,关于:

"\n";

完全不同。它是一个简单的表达式,没有副作用,因此对程序没有影响。优化器将完全丢弃它。当你写作时:
i = 1;

您有一个值被丢弃的表达式;该表达式将根据其修改i的副作用进行计算。
有时,您会发现如下代码:
*ptr++;

编译器将警告您放弃表达式的结果;表达式可以简化为:
ptr++;

并将在节目中达到同样的效果。

08-18 14:55
查看更多