乱入的'\0'
看這個題之前,先來回憶一下strlen函數的工作機制:
strlen所作的僅僅是一個計數器的工作,它從內存的某個位置(可以是字符串開頭,中間某個位置,甚至是某個不確定的內存區域)開始掃描,每碰到一個非’\0’的字符,計數器的值加1,直到碰到第一個字符串結束符’\0’為止,然后返回計數器值(長度不包含’\0’)。
第一眼看到題目是不是覺得太簡單了一點,有一種把1000脫口而出的欲望,這么簡單我會出給你?想太多了吧!
且不說這兒數組的類型是char,就算它的類型是int,程序就會輸出1000?想想上面對strlen的定義是怎么說的?遇到’\0’才結束統計,你能保證數組后面的空間第一個字符就存儲的是’\0’嗎?不能吧!因此不要輕易給出答案。
運行后,輸出的答案是這樣的,是不是有點訝異,整個人突然懵了?大大的問號突然充斥著你。
分析一下,這個題其實無非也就以下幾個考點:
1、負數在內存中的存儲方式;
2、char型數據占空間大小;
3、0其實就是’\0’
4、strlen函數什么時候結束統計;
負數在內存中是以其補碼存儲的,那么問題又來了,什么是補碼?正數的補碼是其原碼,負數的補碼是其原碼取反加1,連原碼都不知道的可以去看看補補了。
因為a[i] = -1 - i; 而-1 - i的值一定是負數,本來也沒什么,但你要知道我們的數組元素是char型的,那么它就只占一個字節,即8個bit,所以,當-1 - i的值小到-129時,a[i]里面存的值就不是我們想象的值了,而當 -1 - i的值小到-256時,a[i]里面存的值會嚇你一跳。看看下面這張圖:
可以看見當i = 255時,a[i] = 0,而我們知道0其實就是’\0’,因為’\0’的ASCII是0,而strlen函數是遇到’\0’停止統計的,且不統計’\0’,也就是說它只統計a[255]前面的元素個數,而我們知道數組下標是從0開始的,所以a[255]前面的元素個數為255個,那么輸出為255就很好解釋了。
這個題仔細分析其實很簡單,但是一不小心就上當了,因此,我們在看待問題是一定要考慮全面,不要輕易下結論。
總結
- 上一篇: unix 登录mysql_实例分析mys
- 下一篇: 线性表之顺序表与单链表的区别及优缺点