【问题标题】:C - single quotes vs double quotesC - 单引号与双引号
【发布时间】:2016-07-02 19:54:16
【问题描述】:

我很好奇这段代码:

int a = 'ftyp';          // a == 1718909296
int b = *((int*)"ftyp"); // b == 1887007846

我的问题:为什么 a != b ?

【问题讨论】:

  • 你应该首先解释你为什么假设:a == b。
  • 大端与小端。当您使用十六进制时,它变得更加明显:a0x66747970b0x70797466
  • 非常感谢。这对我来说是成绩帮助。

标签: c double-quotes single-quotes


【解决方案1】:
int a = 'ftyp';          // a == 1718909296

a 设置为具有实现定义值的多字符常量。 a 的值没有被标准定义。详情请见Single quotes vs. double quotes in C or C++

int b = *((int*)"ftyp"); // b == 1887007846

是由于违反strict aliasing而导致未定义行为的原因。

a == b 的期望是站不住脚的。

【讨论】:

  • 不,这里的问题不是别名。如果要修改别名的对象,则别名只会是一个问题。然后编译器可能会做出错误的假设,即它通过指针看到的对象没有改变。这里真正的问题是可能的错位。
  • @JensGustedt 如果您不使用兼容的对象,行为是否未定义。
  • @JensGustedt,来自 C+11 标准 3.10/10:如果程序尝试通过以下类型之一以外的左值访问对象的存储值,则行为未定义。后面的子句都不允许通过int* 访问字符串文字的值。
  • 在 C 语言问题上引用 C 规范而不是 C++ 会更有说服力。我没有看到 C++ 引用支持这是一个别名,即使它是 @Jens Gustedt 的食物问题的 UB。
  • @chux,很公平。从 C99 标准 6.5/7 开始:一个对象的存储值只能由具有以下类型之一的左值表达式访问:该部分的更多内容在 stackoverflow.com/a/7005988/434551 引用。
猜你喜欢
  • 2011-09-17
  • 2012-12-13
  • 2011-04-10
  • 2012-12-30
  • 1970-01-01
  • 2013-02-07
  • 1970-01-01
相关资源
最近更新 更多