-1

每当我运行这个程序时,它都会给出输出12592。我找不到它背后的逻辑。它在 C 编程中。

#include <stdio.h>

int main()
{

    printf("%d",'10');

    return 0;
}
4

3 回答 3

6

'10'实际上是一个多字符常量。

它有一个类型int,就像 say 一样'1',但它的实际值是实现定义的。

很可能它的值是'1' * 256 + '0'12592 在您的平台上,据我所知,使用 ASCII encoding

于 2018-07-02T09:20:45.910 回答
2

正如其他人所说,您使用的是多字符常量,他们的解释告诉您为什么会得到所要求的结果。

如果您打算打印出整数文字值 10(到目前为止尚未直接评论),请使用

printf("%d",10);

请注意,第二个参数没有单引号。

对于这个问题,

printf("10");

或者

printf("%s","10");

(打印字符串文字)也可以。

于 2018-07-02T11:15:37.707 回答
1

在 C(和 C++)中,撇号字符'用于形成字符常量。通常,撇号之间的内容是一个单个字符,如'A',或表示单个字符的转义序列,如'\n'or'\001''\x01'

由于历史原因,允许在撇号之间放置多个实际字符,如'AB',或您询问的情况,'10'。这些被称为多字符字符常量

这是一件值得怀疑的事情。结果是实现定义的,这意味着它可能在不同的编译器下做不同的事情(尽管文档应该告诉你它做了什么)。C 和 C++ 之间也可能有很大不同。

由于它的作用并没有明确定义,而且即使定义明确也没有什么好的用途,因此通常的建议是不要使用多字符字符常量。(如果你不使用它们,你甚至不必知道它们的作用。)

在大多数 C 编译器下,执行此操作时得到的结果是在内存中“追加”这两个字符的结果——也就是说,通过将两个 8 位数字并排放置来创建一个 16 位数字。(现在我假设多字符字符常量中只有两个字符,尽管实际上可能还有更多)。用一个例子来解释这一点可能最容易:

#include <stdio.h>

int main()
{
    printf("%d (%02x) %d (%02x) -> %d (%02x)\n", 'A', 'A', 'B', 'B', 'AB', 'AB');
    printf("%d (%02x) %d (%02x) -> %d (%02x)\n", '1', '1', '0', '0', '10', '10');
}

在我的机器上打印

65 (41) 66 (42) -> 16706 (4142)
49 (31) 48 (30) -> 12592 (3130)

(但是,旁注,在我的机器上,我的编译器给了我消息“警告:多字符字符常量”,强化了多字符字符常量通常是一个坏主意的概念。)

将第二个示例视为内存中的字节;“1”看起来像

+------+            +----------+
| 0x31 |     或者    | 00110001 |
+------+            +----------+

'10' 看起来像

+------+------+            +----------+----------+
| 0x31 | 0x30 |     或者    | 00110001 | 00110000 |
+------+------+            +----------+----------+

这个数字 12592 是从哪里来的?它是十六进制数 0x3130 的十进制表示。或者,换一种说法,它是 256 × 49 + 48。

于 2018-07-02T11:08:14.880 回答