如果我在尝试打印putchar('\\t');
而不是实际标签时写"\t"
,我会收到多字符常量警告。另一方面,如果我写putchar('\\');
,我没有得到任何警告。查看ASCII表后,没有字符'\\'
,只有'\'
。那为什么没有警告呢?为什么'\\'
有一个字符但'\\t'
不止一个?反斜杠只能用于转义后续字符吗?
答案 0 :(得分:2)
您无法打印\
和t
一次putchar
次调用,因为putchar
会将一个标准输出中只有一个字符。使用2:
putchar('\\');
putchar('t');
另一种选择是将字符串 "\\t"
与fputs
一起使用:
fputs("\\t", stdout);
'\\'
没有警告,因为这是您输入角色\
的字符文字的一种方式。在ASCII上,这与'\134'
和'\x5c'
同义。
从C11 6.4.4.4第2和第4段开始:
<强> 2 强>
整数字符常量是用单引号括起来的一个或多个多字节字符的序列,如
'x'
中所示。 [...]稍后详述的一些例外,序列的元素是源字符集的任何成员;它们以实现定义的方式映射到执行字符集的成员。[...]
<强> 4 强>
双引号
"
和问号?
既可以单独表示,也可以分别由转义序列\"
和\?
表示,但单引号'
和反斜杠\
分别由转义序列\'
和\\
表示。
您收到此警告的原因是该行为完全由实现定义。在C11 J.3.4中,以下列为实现定义的行为:
包含多个字符或包含未映射到单字节执行字符的字符或转义序列的整数字符常量的值(6.4.4.4)。
由于'\\'
包含一个映射到单字节执行字符\
的转义序列,因此没有实现定义的陷阱,也没有任何警告;但是\\t
包含2个字符:\
和t
,并且它不会以您想要的方式执行。
答案 1 :(得分:1)
\\
是一个字符,t
是一个字符,因此显然是两个字符。
\\
是一个转义序列,就像\t
一样;这意味着\
。
如果您要打印两个字符\
和t
,您显然需要两次调用putch()
或一个带有字符串参数的函数"\\t"
。
https://en.wikipedia.org/wiki/Escape_sequences_in_C#Table_of_escape_sequences