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。 大端与小端。当您使用十六进制时,它变得更加明显:a0x66747970b0x70797466 非常感谢。这对我来说是成绩帮助。 【参考方案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 - 单引号与双引号的主要内容,如果未能解决你的问题,请参考以下文章

PHP中单引号与双引号的区别分析

PHP 如何将单引号字符串与双引号字符串连接起来。

PHP教程:PHP中单引号与双引号的区别分析

(实用篇)PHP中单引号与双引号的区别分析

js中的单引号与双引号[重复]

单引号和双引号有啥区别?