天天看點

java移位運算符%3c%3c_scanf("%3c%3c", &a, &b)

問題

在書中看到這樣的描述:

java移位運算符%3c%3c_scanf("%3c%3c", &a, &b)

我們按照這個來操作一下:

代碼

#include

int main(int argc, char const *argv[])

{

char a, b;

scanf("%3c%3c\n", &a, &b);

printf("a = %c b = %c\n", a, b);

return 0;

}

輸入:

abcdefg

輸出:

a = e b = d

跟我們期望中有點不一樣,我們希望他的結果是:a = a b = d,為什麼會這樣呢 ?

解答

這跟a b在記憶體中的位址是有關的

我們先看一下a b的位址:

#include

int main()

{

char a, b;

printf("a = %p\nb = %p\n", &a, &b);

return 0;

}

輸出:

a = 0x7ffeebfb5bcb

b = 0x7ffeebfb5bca

a的位址值比b的大,說明a的位址在b的後面,也就是&a = &b + 1(&是取址符);

a b的位置如下圖所示,一個位址(1個位元組)存一個字元:

java移位運算符%3c%3c_scanf("%3c%3c", &a, &b)

a b的位置示意

把字元讀進a的時候

從左到右讀入:

java移位運算符%3c%3c_scanf("%3c%3c", &a, &b)

讀入a

分别将字元a, b, c寫進~cc,~cd,~ce裡面

把字元讀進b的時候

也是從左到右讀入

java移位運算符%3c%3c_scanf("%3c%3c", &a, &b)

讀入b

分别将字元d, e, f寫進~ca,~cb,~cc裡面。

注意!

原本位址~cb裡面的a被新寫入的e覆寫

原本位址~cc裡面的b被新寫入的f覆寫

列印a、b

因為char a的位址是~cb, ~cb裡面現在是e

而char b的位址是~ca, ~ca裡面現在是d

java移位運算符%3c%3c_scanf("%3c%3c", &a, &b)

輸出結果

所心輸出當然是:

a = e b = d

也可以驗證一下,輸出a位址右邊那個位址裡面的數,理論上應該是f

#include

int main(int argc, char const *argv[])

{

char a, b;

scanf("%3c%3c\n", &a, &b);

printf("a = %c b = %c a右邊那個字元是:%c\n", a, b, *(&a + 1));

return 0;

}

輸出結果:

a = e b = d a右邊那個字元是:f

沒錯,就是這樣。