我是C的初学者,我正在玩C.我输入了这样的C代码:
#include <stdio.h>
int main()
{
printf("hello world\n");
\
return 0;
}
Run Code Online (Sandbox Code Playgroud)
即使我\故意使用,C编译器也不会抛出任何错误.C语言中使用的符号是什么?
编辑:
即便如此:
"\n";
Run Code Online (Sandbox Code Playgroud)
Jon*_*ler 11
序列反斜杠 - 换行符在转换过程的非常早期阶段(阶段2)从代码中删除.它曾经是如何在字符串连接之前创建长字符串文字,以及如何在多行上扩展宏.
参见§5.1.1.2C99标准的翻译阶段:
翻译语法规则的优先级由以下阶段指定.5)
- 物理源文件多字节字符以实现定义的方式映射到源字符集(如果需要,引入行尾指示符的换行符).Trigraph序列由相应的单字符内部表示替换.
\删除反斜杠字符()后面紧跟一个新行字符的每个实例,拼接物理源代码行以形成逻辑源代码行.只有任何物理源线上的最后反斜杠才有资格成为此类拼接的一部分.非空的源文件应以换行符结尾,在进行任何此类拼接之前,该换行符不应立即以反斜杠字符开头.- 源文件被分解为预处理标记6)和空白字符序列(包括注释).源文件不应以部分预处理标记或部分注释结束.每个注释都被一个空格字符替换.保留换行符.是否保留或替换为新行以外的每个非空白字符序列是由实现定义的.
- 执行预处理指令,扩展宏调用,并
_Pragma执行一元运算符表达式.如果通过标记连接(6.10.3.3)生成与通用字符名称的语法匹配的字符序列,则行为未定义.甲#include预处理指令导致从第1阶段至第4阶段处理指定的头或源文件,递归.然后删除所有预处理指令.- 字符常量和字符串文字中的每个源字符集成员和转义序列都将转换为执行字符集的相应成员; 如果没有相应的成员,则将其转换为null(宽)字符以外的实现定义成员.7)
- 相邻的字符串文字标记是连接的.
- 分隔标记的空白字符不再重要.每个预处理令牌都转换为令牌.由此产生的标记在语法和语义上进行分析并翻译为翻译单元.
- 解析所有外部对象和函数引用.链接库组件以满足对当前转换中未定义的函数和对象的外部引用.所有这样的翻译器输出被收集到程序映像中,该程序映像包含在其执行环境中执行所需的信息.
5)实现应该表现为好像发生这些单独的阶段,即使许多通常在实践中折叠在一起.
6)如6.4中所述,将源文件的字符划分为预处理标记的过程是依赖于上下文的.例如,请参阅预处理指令
<中的#include处理.7)实现不需要将所有非对应的源字符转换为相同的执行字符.
如果您在离散反斜杠后有空白或任何其他字符,则会出现编译错误.我们可以告诉您之后没有任何内容,因为您没有编译错误.
你问题的另一部分,关于:
"\n";
Run Code Online (Sandbox Code Playgroud)
是完全不同的.这是一个简单的表达,没有副作用,因此对程序没有影响.优化器将完全丢弃它.当你写:
i = 1;
Run Code Online (Sandbox Code Playgroud)
你有一个表达式,其值被丢弃; 评估它的修饰副作用i.
有时候,你会找到如下代码:
*ptr++;
Run Code Online (Sandbox Code Playgroud)
编译器会警告您表达式的结果被丢弃; 表达式可以简化为:
ptr++;
Run Code Online (Sandbox Code Playgroud)
并将在该计划中取得同样的效果.