2016-07-02 136 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 *'來訪問字符串的值。 –