我很好奇这个代码:Ç - 单引号VS双引号
int a = 'ftyp'; // a == 1718909296
int b = *((int*)"ftyp"); // b == 1887007846
我的问题:为什么A = B!?
我很好奇这个代码:Ç - 单引号VS双引号
int a = 'ftyp'; // a == 1718909296
int b = *((int*)"ftyp"); // b == 1887007846
我的问题:为什么A = B!?
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如果不使用兼容对象,则行为不确定。 – 2501
@JensGustedt,从C + 11标准3.10/10:*如果程序试图通过以下类型之一的glvalue访问对象的存储值,则行为是未定义*。以下任何一个子句都不允许通过'int *'来访问字符串的值。 –
你应该首先解释你为什么假设:a == b。 – 2501
这是大endian vs小端。当你使用十六进制时,它变得更加明显:'a'是'0x66747970','b'是'0x70797466'。 – Cornstalks
非常感谢。这个是我的分数帮助。 – codeDom