它只是一个随机的设计选择,还是有任何特定的原因,C支持行主要而不是列主要? 我知道Fortran使用专业列。 那么这些设计选择背后的原因(如果有的话)是什么?
基于对问题的一些评论以及其他一些答案(以及我自己的一些反思 – 但特别是对C语言设计过程没有任何了解……)我的答案,我相信这是一个基于仅仅的选择做出这个决定的人(里奇?)需要自己做什么。
如果将多维数组的索引解释为矩阵索引,则将第一个索引作为行索引而将第二个索引作为列索引(即列主要结构)是有意义的。 如果你的应用程序在线性代数或其他重量级的计算上很重要,那么以一种方式存储这些结构也是有意义的,这使得一次一列地遍历它们是有效的,因为许多算法都这样做。 出于这个原因,Matlab和Fortran等编程语言可以从列专业中受益 – 它可以更容易地编写带有矩阵和矩阵算法的高效代码。
另一方面,C比Matlab或Fortran更通用。 如果你不打算专门为矩阵使用int**
,那么哪个索引并不重要。 并且看起来很自然,如果a
是一个int**
,那么a[2]
返回一个int*
而a[2][1]
返回一个int
– 你“深入挖掘”到多维数组中。 为了提高效率,我们现在只关心如果我们选择a[2]
并想要迭代它,它应该有效地缓存。 程序员是否a[2]
与矩阵行或矩arrays相关联并不重要 – 我们不使用矩阵!
因此,没有强有力的案例(我可以说出我的头脑),因为C是专栏。 在实现第一个版本时,它可能更容易使它成为行主要 – 也许是因为底层的低级语言(汇编程序?)已经是行主要的 – 就是这样。
在C数组中,元素保证是连续的存储元素,而二维数组是数组的数组,所以对于数组int a[10][20]
; a[0]
本身就是一个数组,它的元素必须是连续的。 同样地a[0]
与a[1]
相邻。
C只定义数组,并允许数组的元素反过来也是数组。 对于数组数组,第一个索引选择一个数组元素,第二个索引选择该数组中的一个值元素。 将其意义颠倒会产生不合逻辑的语法。
将第一个索引解释为行号,将第二个索引解释为某个2D矩阵数据结构的列号就是解释。
请注意,Fortran的(列主要)数组不会通过应用两个单独的索引运算符来编制索引。
编辑:为了给出一个权威的引用,C标准在§6.5.2.1(C99)中说明了多维数组的下标结果是一个n-1维数组
由此得出,数组以行主顺序存储
(强调我的)
需要了解更多c/c++开发分享为什么C语言不支持列主arrays?,也可以关注C/ C++技术分享栏目—计算机技术网(www.ctvol.com)!
以上就是c/c++开发分享为什么C语言不支持列主arrays?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/979324.html