为什么 C 和 Java 声明数组的语法不同,有什么故事吗?

2020-11-08 10:15:54 +08:00
 AndyAO
public class CharArrayTest {
    public static void main(String[] args) {
        type[] arrayRefVar_0;   // 首选的方法
        type arrayRefVar_1[];  // 效果相同,但不是首选方法
    }
}

type arrayName [ arraySize ];

感觉 Java 的首选方法更符合我的直觉.

1577 次点击
所在节点    问与答
9 条回复
lonewolfakela
2020-11-08 10:48:24 +08:00
c 语言的所有类型声明都遵守一个基本的格式:一个“类型” + 一个“用法范例”,数组也不例外
就以数组声明为例子:
int array[1000]
这个意思是说,如果我们按照
array[整数]
这样的格式写一个表达式,就能得到一个 int 型的结果。

如果说数组声明对这个格式的体现还不太明显的话,可以看看函数指针的声明:
int (*p) (int, int)
这表示,如果我们按照
(*p)(整数, 整数)
这样的格式写一个表达式,就会得到一个 int 型的结果。

所以总结下来,c 语言声明语句最左侧其实是写的“这个变量在正确使用后会得到一个什么类型的结果”而不是“这个变量本身是什么类型”,而除开最左边的那个类型之外,声明的右半部分其实是对被声明变量的使用方法的一个示例。
lonewolfakela
2020-11-08 10:52:25 +08:00
相比之下,type[] array 这种风格的声明是更直接的一种:声明的左半部分是“被声明变量本身的类型”,右半部分是“被声明变量的名字”。
这种写法确实更符合更多人的直觉(对数组类型还不太明显,但是如果你写一个返回函数指针的函数指针就能明白 c 语言的那种风格有多不直观了),所以比较新的语言更多地都是采用 type[] array 风格的。
chihiro2014
2020-11-08 11:07:57 +08:00
跟编译原理有关
icyalala
2020-11-08 11:10:27 +08:00
Java:
int[] arrayName = new int[100];

C:
int* arrayName = calloc(100, sizeof(int));

这样就一样了
tairan2006
2020-11-08 11:53:59 +08:00
C 的数组就是一个指针
xiangyuecn
2020-11-08 12:00:15 +08:00
int array[100] 眼睛告诉大脑是 100 个 array❌
int[100] array 眼睛告诉大脑是 100 个 int✅

肉眼可见的伪代码
angryfish
2020-11-08 14:53:00 +08:00
看看 cpo
angryfish
2020-11-08 14:53:08 +08:00
cpp
jin7
2020-11-08 15:17:35 +08:00
JAVA 是最好的语言。。。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/722838

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX