我是C语言的初学者,正在尝试写一些C代码。我写了如下的一段C代码:
#include <stdio.h>
int main()
{
printf("hello world\n");
\
return 0;
}
尽管我有意使用了
\
,但C编译器没有报错。在C语言中,这个符号有什么用途呢?编辑:
甚至下面的代码也能正常运行:
"\n";
我是C语言的初学者,正在尝试写一些C代码。我写了如下的一段C代码:
#include <stdio.h>
int main()
{
printf("hello world\n");
\
return 0;
}
\
,但C编译器没有报错。在C语言中,这个符号有什么用途呢?"\n";
\
),将物理源行拼接成逻辑源行。任何物理源行上的最后一个反斜杠只有在成为这样的拼接的一部分时才有资格。在进行这种拼接之前,不为空的源文件必须以新行字符结尾,该新行字符不得立即在任何这样的拼接之前由反斜杠字符前导。_Pragma
一元运算符表达式。如果通过令牌串联(6.10.3.3)产生与通用字符名称语法匹配的字符序列,则行为是未定义的。 #include
预处理指令导致从阶段1到阶段4递归地处理命名的标头或源文件。然后删除所有预处理指令。#include
预处理指令中处理<
的方式。
7) 实现不需要将所有非对应源字符转换为相同的执行字符。"\n";
i = 1;
*ptr++;
ptr++;
*ptr++;
这个语句将被丢弃,我们应该使用 ptr++;
。但是为什么这个语句 *ptr++;
应该被丢弃呢? - Ant's*ptr++;
中的 *
被丢弃了。它在增量之前计算指针,获取引用值,然后丢弃该值(但增加指针)。该语句的目的是增加指针,但某人在没有思考的情况下添加了星号。这与表达式 *tgt++ = *src++;
完全不同,其中 *
明确需要两次,甚至 (*ptr)++
做了不同的工作,即递增指针所指向的内容。上下文是一个完整的表达式,仅由 *ptr++
组成,在其中 *
是多余的。 - Jonathan Leffler#define SHORT very log macro \
consisting of lots and \
lots of preprocessor \
tokens
如果你删除反斜杠-换行符序列,则不再正确。来自Unix文化的一些其他语言具有类似的反斜杠行继续语法:从Bourne shell派生的POSIX shell语言,以及Makefile。
$ this is \
one shell command
"\n"
是一个原始表达式,用于形成表达式语句。在C语言中,表达式可以用作语句,这种用法经常被利用。例如,您的printf
调用就是一个表达式语句。 printf("hello world\n")
是一个后缀表达式,它调用一个函数并获取返回值。由于您将此表达式用作语句,因此返回值被丢弃了。 printf
的返回值表示打印了多少个字符,或者是否成功,所以通过丢弃它,您的程序变得无视printf
调用是否实际工作。"\n"
)。但是这些无用的表达式语句并不是错误的。如果您在编译器命令行中添加警告选项,您可能会收到警告消息,例如“无效语句”之类的内容。反斜杠\会被C预处理器解释。它保护其后面的字符(在您的情况下是换行符)。
反斜杠只是转义下一个字符。在这种情况下,可能是一个换行符(CR)字符。非常合理。
反斜杠加上其后的内容是转义序列;"\n"代表换行符(打印一个新行)。另一个重要的是"\t",表示制表符。
"\n";
的部分,C程序是一系列语句的集合。字面值(例如3
、"\n"
或者"hamburgers"
)是有效的语句,即使它们不会执行任何操作。 - jpm