繁体   English   中英

Java和C中的数组之间的区别

[英]The difference between arrays in Java and C

在我的书中,有一个示例解释了Java和C中数组之间的区别。

在Java中,我们可以通过编写以下内容来创建数组:

 int[] a = new int[5]; 

这只会在堆栈上为五个整数分配存储空间,我们可以像在Java中那样完全访问它们。

 int a[5] = {0}; int i; for (i = 0, i < 5; i++){ printf("%2d: %7d\\n", i, a[i]); } 

然后作者说以下

当然,我们的程序不应像在示例中的几个地方那样使用数字5,而应使用常量。 我们可以使用C预处理器执行此操作:

 #define SIZE 5 

定义常量SIZE 5有什么优点?

通常,使用命名常量被认为是一种好习惯,因为如果在多个地方使用它,则只需更改定义即可更改值,而无需更改每次出现的值-容易出错。

例如,正如注释中的stark所提到的,您很可能希望遍历数组。 如果数组的大小由名为SIZE的命名常量定义,则可以在循环范围内使用它。 然后,更改数组的大小仅需要更改SIZE的定义。

还有一个问题是#define是否真的是正确的解决方案。 借用乔纳森·莱弗(Jonathan Leffer)的另一条评论:有关常量命名方式的讨论,请参见static const vs #define vs enum 尽管现代C确实允许使用变量作为数组大小说明符,但从技术上讲,这会导致长度可变的数组,这可能会产生少量开销。

您应该使用一个常量,因为在代码中嵌入幻数会使阅读和维护变得更加困难。 例如,如果在某些代码中看到52 ,则您不知道它是什么。 但是,如果您编写#define DECKSIZE 52 ,则每当看到DECKSIZE ,您便确切知道其含义。 另外,如果要更改平台大小,例如durak为36,则只需更改一行,而不用更改整个代码库中的每个实例。

好吧,假设您像创建int my_arr [5];一样创建了一个由5个整数组成的静态数组int my_arr [5]; ,用它编写了一个完整的程序,但是..突然间,您意识到可能需要更多的空间。 假设您编写了6到700行的代码,则必须用您选择的固定编号替换每次出现的数组。 每个for循环,以及与此数组的大小有关的所有内容。 您可以使用预处理程序命令#define避免所有这些情况,该命令将用您想要的内容替换每次出现的“关键字”,这就像某些东西的同义词。 例如: #define SIZE 5将在代码中每次出现的单词SIZE替换为值5。

我发现这里的评论是多余的。 只要您仅使用一次常量(在这种情况下为5 ),那么在哪里都无所谓。 此外,将其放置在适当位置可以提高可读性。 而且您当然不需要在多个地方使用常数-毕竟,无论如何,您应该通过sizeof运算符来推断数组的大小。 sizeof方法的好处是它可以与VLA无缝协作。

全局#define (或任何其他全局名称)的缺点是它污染了全局名称空间。 应该理解,全局名称是一种保守使用的资源。

#define SIZE 5

这似乎是在恐龙时代流行的用C代码声明常量的一种过时的旧方法。 我想有些这种风格的恋人还活着。

如今,使用C语言声明常量的首选方法是:

const int kSize = 5;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM