今天遇到這樣一個小程序,覺得當中有些問題很容易讓人忽略的!
這個程序代碼如下:
程序的結果為:
我想很多像我一樣的小白可能才開始是想不明白為什麼最後的結果是255吧!首先,我們得知道 strlen()是計算字符串長度的函數,但為什麼最後得到的字符串長度是255呢?定義的數組a中不是有1000個元素,並且for循環也是執行999次嗎?
對於char來說,我們得知道其隱含的結束標記是\0,當編譯器識別一個char類型的變量時,讀取到\0,則標志著結束;對於這個程序,我們還得注意char的取值圍:-128~127
所以當i = 128時 a[128] = -1 -128 = -129 ,那麼到這裡就出現問題了,a 中元素的最小值只能為-128,怎麼辦?在這裡得知道,在計算機中,存儲數據都是以補碼的方式存儲的,-128在計算機中的編碼為1000 0000 ,-1的補碼為1111 1111 ,所以-129 的補碼為 1 0111 1111 ,但是char中的二進制位只有八位,所以把最高位丟掉,剩下的其余為作為補碼,也就是0111 1111(0x7f)通過循環,依次減一 0x7d,0x7c,0x7b,0x7a,0x79,0x78,0x77,0x76,0x75,0x74,0x73,0x72,0x71,0x70......0x00,所以當編碼為0x00時,a[255]= 0;所以當a[255]= 0時,作為字符串結束的標志,在a[0]~a[254]的元素都不為0,所以最終程序執行的結果就是字符串a的長度為255.