我很好奇這個代碼:Ç - 單引號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