为什么C语言不支持列主阵列?

时间:2013-01-07 18:18:08

标签: c

它只是一个随机设计选择还是有任何特定原因使C支持行主要而不是列主要?我知道Fortran使用了专业列。那么这些设计选择背后的原因是什么(如果有的话)?

3 个答案:

答案 0 :(得分:7)

基于对问题的一些评论以及其他一些答案(以及我自己的一些反思 - 但特别是对C语言设计过程没有任何了解......),我认为这是一个选择仅基于做出这一决定的人(里奇?)需要自己。

如果将多维数组的索引解释为矩阵索引,则将第一个索引作为行索引而将第二个索引作为列索引(即列主要结构)是有意义的。如果你的应用程序在线性代数或其他重量级的计算上很重要,那么以一种方式存储这些结构也是有意义的,这样可以一次一行地遍历它们,因为许多算法都是这样做的。出于这个原因,Matlab和Fortran等编程语言可以从列专业中受益 - 它可以更容易地编写带有矩阵和矩阵算法的高效代码。

另一方面,C比通用目的更具通用性。 Matlab或Fortran。如果您不打算将int**专门用于矩阵,那么哪个索引无关紧要。如果aint**,那么a[2]会返回int*a[2][1]会返回int - 你会“深​​入挖掘”似乎很自然“进入多维数组。为了提高效率,我们现在只关心如果我们选择a[2]并想要迭代它,它应该有效地缓存。 如果您(程序员)将a[2]与矩阵行或矩阵列相关联,那么无关紧要 - 我们不使用矩阵!

因此,没有强有力的案例(我可以说出我的头脑中),因为C是专栏。在实现第一个版本时,它可能只是更容易使其成为行主要 - 也许是因为底层的低级语言(汇编程序?)已经是行主要的 - 那是这一点。

答案 1 :(得分:2)

在C数组中,元素保证是连续的内存元素,而2维数组是数组的数组,所以对于数组int a[10][20]; a[0]本身就是一个数组,它的元素必须是连续的。同等地a[0]a[1]相邻。

答案 2 :(得分:0)

C只定义数组,并允许数组的元素反过来也是数组。对于数组数组,第一个索引选择一个数组元素,第二个索引选择该数组中的一个值元素。将其意义颠倒会产生不合逻辑的语法。

将第一个索引解释为行号,将第二个索引解释为某个2D矩阵数据结构的列号就是解释。

请注意,Fortran的(列主要)数组不会通过应用两个单独的索引运算符进行索引。

编辑:为了给出一个权威性的引用,C标准在§6.5.2.1(C99)中说明了下标多维数组的结果是一个n-1维数组

  

从此开始,数组以行主顺序存储

(强调我的)