【问题标题】:Why does this code with '1234' compile in C++?为什么这个带有 '1234' 的代码在 C++ 中编译?
【发布时间】:2013-10-24 00:28:47
【问题描述】:

为什么会编译:

char ch = '1234'; //no error

但不超过 4 个chars :

char ch = '12345'; //error: Too many chars in constant

(是的,我知道' ' 用于一个char" " 用于字符串;我只是在试验)

这是否与chars 使用 ASCII 数字表示这一事实有关?

【问题讨论】:

标签: c++ char


【解决方案1】:

C++ 有一种叫做“多字符文字”的东西。 '1234' 就是一个例子。它们的类型为int,由实现定义它们具有什么值以及它们可以包含多少个字符。

这与字符表示为整数这一事实直接无关,但很有可能在您的实现中'1234' 的值被定义为:

'1' + 256 * '2' + 256 * 256 * '3' + 256 * 256 * 256 * '4'

或:

'4' + 256 * '3' + 256 * 256 * '2' + 256 * 256 * 256 * '1'

【讨论】:

  • 使用移位运算符或幂符号应该更容易理解
  • 真的被定义为这两者之一吗?我认为它完全未指定。
  • @Yakk。它是实现定义的,而不是未指定的。 “机会很好”意味着这是实施可能会做出的两个选择。
  • 第二个版本适合我。
【解决方案2】:

这是一个多字符文字,类型为int

C++11 §2.13.2 字符字面量

字符文字是用单引号括起来的一个或多个字符,如’x’,前面可选字母L,如L’x’。不以L 开头的字符文字是普通字符文字,也称为窄字符文字。包含单个 c-char 的普通字符文字具有 char 类型,其值等于执行字符集中 c-char 编码的数值。 包含多个 c-char 的普通字符文字是多字符文字。多字符文字具有 int 类型和实现定义的值。

【讨论】:

  • @soandos 数字被视为普通字符'1''2' 等。根据标准,它具有实现定义的值,但通常该值如@Steve Jessop 所说他的回答。
  • 问题的第二部分:为什么在5个或更多字符处出错?该实现是否已定义?
  • @Yakk 我想是的。很可能 5 个或更多字符的值会大于 32 位 int,我在 GCC 下进行了测试,这是一个警告,而不是错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-30
  • 2014-03-01
  • 2010-11-24
相关资源
最近更新 更多