2016-07-02 137 views
4

我很好奇这个代码:Ç - 单引号VS双引号

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

我的问题:为什么A = B!?

+1

你应该首先解释你为什么假设:a == b。 – 2501

+3

这是大endian vs小端。当你使用十六进制时,它变得更加明显:'a'是'0x66747970','b'是'0x70797466'。 – Cornstalks

+0

非常感谢。这个是我的分数帮助。 – codeDom

回答

8
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生病了。

+1

不,这里的问题不会出现锯齿。如果一个别名的对象会被修改,那么别名只会是一个问题。然后,编译器可能会假设它通过指针看到的对象没有改变。这里真正的问题是可能的错位。 –

+0

@JensGustedt如果不使用兼容对象,则行为不确定。 – 2501

+0

@JensGustedt,从C + 11标准3.10/10:*如果程序试图通过以下类型之一的glvalue访问对象的存储值,则行为是未定义*。以下任何一个子句都不允许通过'int *'来访问字符串的值。 –