V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
AndyAO
V2EX  ›  问与答

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

  •  1
     
  •   AndyAO · 2020-11-08 10:15:54 +08:00 · 1570 次点击
    这是一个创建于 1267 天前的主题,其中的信息可能已经有所发展或是发生改变。
    public class CharArrayTest {
        public static void main(String[] args) {
            type[] arrayRefVar_0;   // 首选的方法
            type arrayRefVar_1[];  // 效果相同,但不是首选方法
        }
    }
    
    
    type arrayName [ arraySize ];
    

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

    第 1 条附言  ·  2020-11-08 12:38:45 +08:00
    xiangyuecn
    lonewolfakela
    这两位的回答令人印象深刻,很有帮助.
    9 条回复    2020-11-08 15:17:35 +08:00
    lonewolfakela
        1
    lonewolfakela  
       2020-11-08 10:48:24 +08:00   ❤️ 12
    c 语言的所有类型声明都遵守一个基本的格式:一个“类型” + 一个“用法范例”,数组也不例外
    就以数组声明为例子:
    int array[1000]
    这个意思是说,如果我们按照
    array[整数]
    这样的格式写一个表达式,就能得到一个 int 型的结果。

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

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

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

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

    肉眼可见的伪代码
    angryfish
        7
    angryfish  
       2020-11-08 14:53:00 +08:00 via iPhone
    看看 cpo
    angryfish
        8
    angryfish  
       2020-11-08 14:53:08 +08:00 via iPhone
    cpp
    jin7
        9
    jin7  
       2020-11-08 15:17:35 +08:00 via Android
    JAVA 是最好的语言。。。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5345 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 09:20 · PVG 17:20 · LAX 02:20 · JFK 05:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.