C - 单引号与双引号
Posted
技术标签:
【中文标题】C - 单引号与双引号【英文标题】:C - single quotes vs double quotes 【发布时间】:2016-07-02 19:54:16 【问题描述】:我很好奇这段代码:
int a = 'ftyp'; // a == 1718909296
int b = *((int*)"ftyp"); // b == 1887007846
我的问题:为什么 a != b ?
【问题讨论】:
你应该首先解释你为什么假设:a == b。 大端与小端。当您使用十六进制时,它变得更加明显:a
是 0x66747970
和 b
是 0x70797466
。
非常感谢。这对我来说是成绩帮助。
【参考方案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 开始:一个对象的存储值只能由具有以下类型之一的左值表达式访问:该部分的更多内容在 ***.com/a/7005988/434551 引用。以上是关于C - 单引号与双引号的主要内容,如果未能解决你的问题,请参考以下文章