字符常量中的多个字符

时间:2011-08-04 16:03:39

标签: c

  

某些C编译器允许字符常量中包含多个字符。   这意味着写“是”而不是“是”可能不会被发现。   资料来源:C陷阱和陷阱

任何人都可以举例说明字符常量中允许多个字符吗?

3 个答案:

答案 0 :(得分:15)

正如Code Monkey所引用的,它是实现定义的,实现方式各不相同 - 它不仅仅是BigEndian / LittleEndian和charset的区别。我已经使用程序

测试了四种实现(全部使用ASCII)
#include <stdio.h>

int main()
{
    unsigned value = 'ABCD';
    char* ptr = (char*)&value;

    printf("'ABCD' = %02x%02x%02x%02x = %08x\n", ptr[0], ptr[1], ptr[2], ptr[3], value);
    value = 'ABC';
    printf("'ABC'  = %02x%02x%02x%02x = %08x\n", ptr[0], ptr[1], ptr[2], ptr[3], value);
    return 0;
}

我得到了四个不同的结果

Big endian(AIX,POWER,IBM编译器)

'ABCD' = 41424344 = 41424344
'ABC'  = 00414243 = 00414243

Big endian(Solaris,Sparc,SUN编译器)

'ABCD' = 44434241 = 44434241
'ABC'  = 00434241 = 00434241

Little endian(Linux,x86_64,gcc)

'ABCD' = 44434241 = 41424344
'ABC'  = 43424100 = 00414243

Little endian(Solaris,x86_64,Sun编译器)

'ABCD' = 41424344 = 44434241
'ABC'  = 41424300 = 00434241

答案 1 :(得分:8)

我猜你可以在案例陈述中使用它,但我不推荐它。

'yes'是一个多字符常量。其类型为int,其值取决于实现。就像你已经说过的那样,这取决于编译器。

所以int foo = 'yes';

ARM,第2.5.2节,第9页:

  

“字符常量是一个或多个包含在单个字符中的字符   引号,如'x'。“

稍后在同一页面上:

  

“多字符常量的类型为int。的值为   多字符常量取决于实现。例如,   “AB”的价值可以合理地预期为“A”,“B”和   ('A'&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&quot;&gt;'+'''多字符   通常最好避免常数。“

引用ANSI C规范(C ++尝试兼容):

  

3.1.3.4字符常量语义

     

整数字符常量的类型为int [注意它的类型为char   in C ++] ...包含更多的整数字符常量的值   比一个字符......是实现定义的。

答案 2 :(得分:5)

在允许使用单字符常量的所有上下文中,多字符常量允许

至于它们实际使用的位置,我已经看到使用多字符常量来创建清晰唯一值的代码。例如,假设int是4个字节,'ABCD'和'EFGH'可能是不同的。 (这不是语言所保证的;实现必须记录映射,但它不一定合理。)并且假设合理的映射,您可能会在目标代码中看到“ABCD”或“EFGH”。这不是世界上最好的想法,但如果你不太关心可移植性,它可以工作。

顺便提一下,所有符合C的编译器都支持多字符常量(根据定义;不支持它们的编译器是不符合的)。