c++ 不能分配给为0的数组_【嵌入式C】你有想过quot;数组下标quot;为何从0开始吗?...
1、聊一聊
相信大家都有看過電影,今天所分享的是其經典背景音樂,或許音樂響起你又會想起那條單純、善良的秋田犬!? ? ?今天跟大家聊聊一個有意思的話題,C中的數組下標為啥是從0開始?或者說為什么現在大部分的編程語言都會選擇從0開始索引!本文將從三個方面展開這個話題。
2、話題引出
凱爺,你見過數組下標從1開始的編程語言嗎?
額~ ,我想想,似乎好像matlab的數組是從1開始的。
不會吧,感覺數組用1開始的編程語言很少吧!那為什么都是從0開始呢?1開始不是很好嗎?
我在有些書上看過類似的解釋,從0開始設計上會方便很多,應該也有一定的歷史原因吧。管那么多干嘛,怎么規定怎么用就好了呀!
確實意義倒不大,不過我還是有些好奇,畢竟我是靠C吃飯的!
bug菌,你知道數組下標為何從0開始嗎?
這個問題有點難為我了,畢竟我不是語言考古學家,不過我可以跟你聊聊我的一些想法,參考一下!
1
慣性思維?
從我們開始學習數數,并且用手指頭開始比劃著的時候,大人們就會教我們"1、2、3、4。。。。。。"一共10根手指。同樣,當我們去別人家做客,然后問樓層的時候,也是第1層、第2層。。。,最多也就有個-1或者-2層,并沒有說0層等等。
于是,生活中這些從1開始計數的方式順理成章的就會讓我們形成一種凡事都從1開始的慣性思維,而當我們開始學習C編程卻發現數組、計數等等都是從0開始的,最開始還不怎么習慣,硬著頭皮久而久之也就適應了。
其實生活中也是存在非常多從0開始標識的變量,比如下面的尺子,其測量長度就是從0開始的,同樣時鐘也是從零開始計時。
于是大體可以找到一絲共性,從0開始的標識方式大部分都是為了表征一種距離和偏移量,而從1開始標識則是為了表征個體數量等等。
2
簡化運算與編譯器
此觀點應該是大部分教科書所表達的,C語言的精髓當然屬于指針了,而指針的索引采用的就是一種偏移的概念。
比如我們經常使用的ptr + 4 的地址為:?ptr_Addr + 4*sizeof(type),當使用指針去索引數組Array[10],則用ptr指向數組頭Array,理所當然*(ptr + 4)?= Array[4];也可表示為?Array +?4*sizeof(type),從而指針的偏移剛好等于數組下標。
如果Array數組從1開始標識*(ptr + 4)?= Array[5];這樣一方面不便于我們代碼上理解,很容易忘記+1或者-1;另外一方面對于編譯器解析代碼還需要進行-1操作,勢必會加長編譯時間。
所以Array從0開始標識也是為了與指針的偏移概念對齊,可以說數組下標表征的就是偏移量,而非標識的第一個元素!
3
終極底層思想
除了C語言,現在大部分編程語言都是用0開始標識數組,比如C++,JAVA等等,這些相對后起的語言大多是為了延續著C的風格和習慣,或者是借鑒C的優點,這樣一方面便于程序員更加自然的在多種編程語言中分析解決問題,另一方面為多種語言之間的相互調用、融合也會帶來便利。
不過如果僅僅只是一種遷就那終將被時代所拋棄,回首看看有多少編程語言在程序員的指尖溜走,而C現在都四五十歲了,仍然保持著活力,對于數組從0開始標識當然也是容不得半點馬虎的。
C語言的特色在于它可以靈活的控制底層硬件卻又保持著高級語言的易用和易懂屬性,所以它算是一門非常接近底層硬件的語言。
然而芯片可供程序員的控制操作大部分都是數字電路的組合,那么0/1電平,定時器的計數、系統寄存器、存儲器的初始化狀態值等等,均為0開始編碼,既然C作為一門與底層非常親近的語言,能夠對硬件進行一種數據的抽象是一個非常自然的設計,這樣就可以避免非常多用1開始標識而需要重新對齊的問題。
bug菌,第三點我真的太贊同了!
我仿佛又吹了一波C語言的牛!
3、結束語
? ? ?做為一名多年的C愛好者,以上就是個人對該問題的一些理解了,最終答案還是由C語言考古隊來發表吧。
????好了,這里是公眾號:“最后一個bug”,一個為大家打造的技術知識提升基地,如果你喜歡交流可以添加下方bug菌微信,我拉你加入公眾號技術交流群。
推薦好文??點擊藍色字體即可跳轉
?【開源】bug菌把"動態數字顯示"開源了!
?【MCU】可怕,別人把我MCU固件給反匯編了!(逆向)
??【程序人生】學不到東西,不想呆在這家公司了!
??【C進階】"最常見"卻又"最不常用"的三個預編譯
總結
以上是生活随笔為你收集整理的c++ 不能分配给为0的数组_【嵌入式C】你有想过quot;数组下标quot;为何从0开始吗?...的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: mysql离散查询_如何写出高性能的My
 - 下一篇: axure 鼠标变成手,Axure教程|