【问题标题】:Is there any justification for addressing array like <number>[array]? [closed]像 <number>[array] 这样寻址数组有什么理由吗? [关闭]
【发布时间】:2019-06-20 09:51:18
【问题描述】:

最近我看到一个问题的答案,他们解释说以这种方式寻址数组&lt;number&gt;[array] 是有效的 C 代码。 How do square brackets work in C?

例子:

char x[] = {'A','B','C','D','E','F','G','H','I','J'};
printf("%d\n",5[X]);
//Will print 70 == 'F'

对于包括作者在内的所有人来说,这种表示法似乎很麻烦并且可能令人困惑。

这种寻址数组的方式是否有一些正当的优势?

我可以无忧无虑地继续我的生活吗?

【问题讨论】:

  • 即使如何设置代码样式只是一个见仁见智的问题,也有合理的理由使用某些语法而不是其他语法。因此问题。
  • @kiranBiradar 我不同意。关于清洁代码的通用建议很少纯粹基于意见。使用这种语法没有好处,只有坏处,因此客观上很糟糕。另外,OP没有问它是否好。 OP询问is是否有任何优势。
  • @kiranBiradar 我不同意。 OP 明确要求提供理由。鉴于这种语法是明确合法的,这是一个有效的问题。 (答案是,这甚至没有正当理由合法。C 的作者只是想聪明一点:下标操作没有理由支持交换语法)
  • @kiranBiradar 这绝对不是。答案可能是“没有客观的利弊”,但这是一个客观的答案。
  • @RuudHelderman 我认为是的。

标签: c


【解决方案1】:

我从未在“真实代码”中遇到过这种情况(即,在故意混淆事物和人为限制的谜题之外),因此似乎普遍认为不应该这样做。

但是,我可以想出一个人为的示例,在该示例中,某些人(不一定是我)可能会认为它是一种更好的语法:如果您有与列中的单个实体相关的多条数据,并且您表示行作为不同的数组:

enum { ADA, BRIAN, CLAIRE };
const char *name[] = { "Ada", "Brian", "Claire" };
const unsigned age[] = { 30, 77, 41 };

printf("%s is %u years old\n", ADA[name], ADA[age]);

我将是第一个同意这会混淆语法,使人看起来像是数组而不是索引,在大多数情况下,我更喜欢struct 的数组。不过,我认为可以提出一个更好看的案例,或者在某些情况下,它可能是一种交换行和列(数组和索引)的方法,而在其他地方进行最少的编辑。

【讨论】:

  • 我认为最危险的是它看起来很合理。 :D
  • 嗯,有趣的用例...假设具有 ROM 和 RAM 的特殊架构,以及具有 const 和 mutable 成员的数据集。使用结构体,我们需要将所有内容放入 RAM,使用单独的数组,我们可以将 const 部分放入 ROM,而只将可变部分留在 RAM 中...
  • 这几乎就像实体组件设计的开始;特别是,使用数组结构,可以将“字段”添加到ADA 和朋友,而不会影响当前存在的数据的布局。对我来说,这实际上看起来很优雅。
【解决方案2】:

据我所知,这两种方法都没有技术优缺点。它们是 100% 等效的。正如您提供的链接所说,a[i] = *(p+i) = [加法是可交换的] = *(i+p) = i[a]

对于主观的利弊,这令人困惑。所以index[array] 的形式对于代码混淆很有用,但除此之外我根本看不到它的任何用途。

使用标准方式的一个原因(但我真的在这里挖掘)是a[b+c] 不等于b+c[a]。您必须写 (b+c)[a] 以使其等效。这在宏中尤其重要。出于这个特殊原因,宏通常在每个用法中的每个参数周围都有括号。

这与写if(2==x) 而不是if(x==2) 的论点基本相同。如果您不小心写了= 而不是==,第一种方法会出现编译器错误。

我可以无忧无虑地继续我的生活吗?

是的。

【讨论】:

    【解决方案3】:

    是的,指针算术是可交换的,因为加法是可交换的。像a[n] 这样的引用被转换为*(a+n),但n[a] 也被转换为*(n+a),这是相同的。如果你想赢得 iocc 比赛,你必须使用它。

    【讨论】:

    • 您已经解释了为什么指针算术是可交换的。您没有解释了为什么数组下标是可交换的:它可能在语义上等价于指针算术+解引用,但显然它在句法上不等价。跨度>
    猜你喜欢
    • 1970-01-01
    • 2019-11-16
    • 1970-01-01
    • 2018-08-02
    • 2013-11-21
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多