3

我知道 \x 是 ASCII 文字的十六进制表示

printf("%c",'\x41'); // A
printf("%c",'\X41'); // 1

为什么?

参考:http ://c.comsci.us/etymology/literals.html (见最底表)

4

3 回答 3

8

这不是标准的,因此结果会有所不同。

鉴于这\X不是一个有效的控制序列,您的特定编译器正在选择单引号中的最后一个字符并使用它。

所以,如果你这样做了:'\X12345'你可能会得到5. 没有什么特别的\X。如果你把它从你躲闪的字符文字中去掉,你会得到相同的结果。

于 2013-07-02T05:07:50.917 回答
7

我要求你编译-Wall选项。

aaa.c: In function ‘main’:
aaa.c:6:14: warning: unknown escape sequence: '\X' [enabled by default]
aaa.c:6:14: warning: multi-character character constant [-Wmultichar]

从上面的消息 X 被忽略。

考虑到“41”,这是多字符字符常量。

正如@paddy 所说,使用了单引号中的最后一个字符。所以打印字符'1'。

转义序列集

\a alert (bell) character              \\ backslash
\b backspace                           \? question mark
\f formfeed                            \’ single quote
\n newline                             \" double quote
\r carriage return                     \ooo octal number
\t horizontal tab                      \xhh hexadecimal number
\v vertical tab
于 2013-07-02T05:06:19.133 回答
1

第一行\x41是正确的,0x41 是 'A' 的 ASCII 值,因此打印了 'A'。

第二行是语法错误,因为 \X(大写)不是有效的转义序列。现在发生的情况取决于您的编译器,但 GCC 会将 \X4 视为无效并忽略它,而将“1”作为要打印的文字字符。

于 2013-07-02T05:09:48.313 回答