2012-07-31 81 views

回答

5

这是实现定义为更早的答案已经说过。

我的gcc把'ab'作为int来处理。下面的代码:

printf("sizeof('ab') = %zu \n", sizeof('ab')); 
printf("'ab' = 0x%08x \n", 'ab'); 
printf("'abc' = 0x%08x \n", 'abc'); 

打印:

sizeof('ab') = 4 
'ab' = 0x00006162 
'abc' = 0x00616263 

在你的代码中,行:

char c = 'ab'; 

可被视为:

char c = (char)(0x00006162 & 0xFF); 

所以C得到'ab'的最后一个字符的值。在这种情况下,它是'b'(0x62)。

1

因为'ab'的类型为intchar只能容纳一个字节。

+0

这并不回答这个问题,这就是为什么它得到'b'而不是'a',而不是为什么它得到'b'而不是'ab'。 – 2012-07-31 09:56:19

+0

@JimBalter这个问题被编辑了,在我回答的时候没有*而不是'a'*。 – ouah 2012-07-31 10:03:13

+1

P.S.由于这是一个C语言问题,''a''和''b''也有'int'类型。 – 2012-07-31 10:04:00

5

的整数多字符常数的值是实现定义的,根据标准C11(§6.4.4.4 “字符常数” AL10 P69):

10 - [...]包含多个字符(例如, 'ab')或包含未映射到单字节 执行字符的字符或转义序列的整数字符常量的值为实现定义的。 [...]

+0

C90和C99标准具有相同的规则。 – 2012-08-06 21:00:16

10

根据标准,它是实现定义的。从6.4.4.4字符常量

一个整数的字符常数具有int类型。包含映射到单字节执行字符的单个字符的整数字符常量 的值是被解释为整数的映射字符的表示形式的 数值。 包含多个字符(例如, 'ab')或包含未映射到单字节 执行字符的字符或转义序列的整数字符常量的值是实现定义的。

+1

@ouah,它怎么没有?它表明它是由实现什么'int'值分配给多字符文字。 – hmjd 2012-07-31 09:55:42

+0

@ouah无论单个字符常量的值是多少,'b'仍然表示为'b'。这个答案确实回答了为什么'b'而不是'a'(即它取决于实现),而你的答案甚至没有涉及到这个问题。 – 2012-07-31 09:58:49

+0

@JimBalter实际上,OP编辑了他的问题以添加*而不是'a'*,这使得恕我直言改变了一些原始问题的意图。 – ouah 2012-07-31 10:01:58

-1

后来编辑:我的回答与之前的答案是相辅相成的,很清楚地表明这是实现特定的行为。我在OP想知道的印象之下,考虑到这一点,为什么编译器选择'b'而不是'a'。对不起,如果我的答案令人困惑。

Endianess。这就是为什么你得到'b'而不是'a'。 由于您的机器内存中表现如何。 而你的机器可能是小端。

在sparc或mipsbe或胳膊上试试它,你可能会得到'a'而不是'b'。

在任何情况下,我希望你不要依赖于这个实际的生产代码。

+0

不只是恩典。即使数值本身的字符顺序也是未定义的。不同的编译器使用不同的表示方式(例如GCC vs. Visual Studio)。 – Suma 2012-07-31 11:12:40

+0

确实。但我认为这已经由之前的答案解决了。我只是想澄清为什么OP可能在测试中得到'b'而不是'a'。编译器可能会根据它运行的平台选择简单的表示和访问方式。 – 2012-07-31 11:53:59

相关问题