今天在工作時看到一段略顯奇怪的代碼段,大概是這樣的:
switch (flag) { case 'ABCD': TODO break; case 'EFDG': ... break .... default: break; }按鈕C++的標准,flag是一個整形,對於最近寫慣了Lua的我而言,這種用法一下變得陌生起來了,我想對於很多人而言,這種用法或許都是陌生的,時間有限暫且不去管C++標准中對'ABCD'這個“字符串”是如何定義的,那麼從寫法上來看‘ABCD’應該是表示了一個整型常量,所以下面我來寫一段代碼來看一下這個用法的是怎麼一回事:
#include#include using namespace std; int main() { int flag = 'ABCD'; cout<< flag <
那麼輸出的結果是什麼呢:1094861636
DCBA從結果中可以看出G++將‘ABCD’每個字符逐個賦給了flag這個變量的每個字節,由於我們使用的是Intel的CPU,基於x86的架構。而於X86采用的是小端模式,即將整形的高位放在了內存的低地址處. 如果加一個輸出printf("%X\n", flag)會看到輸出為41424344, 41其實是字符A,所以'ABCD'其實代表的值就是 A << 24 + B << 16 + C << 8 + D.
由於CPU采用小端模式,故而將flag強制轉換成字符串輸出是將A放在了最後輸出,因為A是該整型的高位。
By the way, 如果寫成flag = 'ABC' 或者 flag = 'ABCDE"會出現什麼事呢?自己動手試一下,有一種情況是編譯不通過的哦。
END