转义 \t 的多字符常量警告
Multi character constant warning for escaped \t
如果我在尝试打印 "\t"
而不是实际制表符时写入 putchar('\t');
,我会收到多字符常量警告。另一方面,如果我写 putchar('\');
我不会收到任何警告。查看 ASCII table,没有字符 '\'
,只有 '\'
。那么为什么没有警告呢?为什么 '\'
是一个字符,而 '\t'
是多个字符?反斜杠只能用于转义后面的一个字符吗?
你不能用一次putchar
调用打印\
和t
,因为putchar
把一个 并且只有一个字符进入标准输出。使用 2:
putchar('\');
putchar('t');
另一种选择是使用 字符串 "\t"
和 fputs
:
fputs("\t", stdout);
'\'
没有警告,因为这是输入字符 \
的字符文字的一种方式。在 ASCII 上,这与 '4'
和 '\x5c'
.
同义
来自 C11 6.4.4.4 第 2 段和第 4 段:
2
An integer character constant is a sequence of one or more multibyte characters enclosed in single-quotes, as in 'x'
. [...] With a few exceptions detailed later, the elements of the sequence are any members of the source character set; they are mapped in an implementation-defined manner to members of the execution character set.
[...]
4
The double-quote "
and question-mark ?
are representable either by themselves or by the escape sequences \"
and \?
, respectively, but the single-quote '
and the backslash \
shall be represented, respectively, by the escape sequences \'
and \
.
您收到警告的原因是该行为完全由实现定义。在 C11 J.3.4 中,以下内容被列为实现定义的行为:
The value of an integer character constant containing more than one character or containing a character or escape sequence that does not map to a single-byte execution character (6.4.4.4).
由于 '\'
包含映射到单字节执行字符的转义序列 \
,因此没有实现定义的陷阱,也没有什么值得警告的;但是 \t
包含 2 个字符:\
和 t
,并且它不会执行您想要的可移植操作。
\
是一个字,t
是一个字,分明是两个字。
\
是一个转义序列,就像\t
一样;这意味着 \
.
如果你想打印两个字符 \
和 t
,你显然需要两次调用 putch()
或一个接受 string 参数 "\t"
.
https://en.wikipedia.org/wiki/Escape_sequences_in_C#Table_of_escape_sequences
如果我在尝试打印 "\t"
而不是实际制表符时写入 putchar('\t');
,我会收到多字符常量警告。另一方面,如果我写 putchar('\');
我不会收到任何警告。查看 ASCII table,没有字符 '\'
,只有 '\'
。那么为什么没有警告呢?为什么 '\'
是一个字符,而 '\t'
是多个字符?反斜杠只能用于转义后面的一个字符吗?
你不能用一次putchar
调用打印\
和t
,因为putchar
把一个 并且只有一个字符进入标准输出。使用 2:
putchar('\');
putchar('t');
另一种选择是使用 字符串 "\t"
和 fputs
:
fputs("\t", stdout);
'\'
没有警告,因为这是输入字符 \
的字符文字的一种方式。在 ASCII 上,这与 '4'
和 '\x5c'
.
来自 C11 6.4.4.4 第 2 段和第 4 段:
2
An integer character constant is a sequence of one or more multibyte characters enclosed in single-quotes, as in
'x'
. [...] With a few exceptions detailed later, the elements of the sequence are any members of the source character set; they are mapped in an implementation-defined manner to members of the execution character set.[...]
4
The double-quote
"
and question-mark?
are representable either by themselves or by the escape sequences\"
and\?
, respectively, but the single-quote'
and the backslash\
shall be represented, respectively, by the escape sequences\'
and\
.
您收到警告的原因是该行为完全由实现定义。在 C11 J.3.4 中,以下内容被列为实现定义的行为:
The value of an integer character constant containing more than one character or containing a character or escape sequence that does not map to a single-byte execution character (6.4.4.4).
由于 '\'
包含映射到单字节执行字符的转义序列 \
,因此没有实现定义的陷阱,也没有什么值得警告的;但是 \t
包含 2 个字符:\
和 t
,并且它不会执行您想要的可移植操作。
\
是一个字,t
是一个字,分明是两个字。
\
是一个转义序列,就像\t
一样;这意味着 \
.
如果你想打印两个字符 \
和 t
,你显然需要两次调用 putch()
或一个接受 string 参数 "\t"
.
https://en.wikipedia.org/wiki/Escape_sequences_in_C#Table_of_escape_sequences