奇怪的C行为

Pol*_*ium -1 c

这里发生了什么?

#include <stdio.h>
int main (void)
{
  int x = 'HELL';
  printf("%d\n", x);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

打印 1212501068

我期待编译错误.

欢迎解释=)

NPE*_*NPE 13

1212501068十六进制是0x48454c4c.

  • 0x48是ASCII代码H.
  • 0x45是ASCII代码E.
  • 0x4c是ASCII代码L.
  • 0x4c是ASCII代码L.

请注意,此行为是实现定义的,因此不可移植.一个好的编译器会发出警告:

$ gcc test.c
test.c: In function 'main':
test.c:4:11: warning: multi-character character constant [-Wmultichar]
Run Code Online (Sandbox Code Playgroud)

  • 它是实现定义的.:-) (9认同)

3Do*_*ons 9

在C中,单引号用于表示字符,这些字符在数字内存中表示.当您在单引号中放置多个字符时,编译器会将它们组合在一个值中,但只要它记录该过程.

查看您的号码,1212501068是0x48454C4C.如果将此数字分解为字节,则得到48"H" 45或"E"两次4C或"L"

  • "..尽最大努力将它们合并为一个单一的价值".这很乐观.由于行为是依赖于实现的,因此编译器可以选择将每个"multichar"常量映射到值"-2"(因此不是很有用).唯一的限制是**必须记录其行为**. (2认同)