是否有理由对像<number> [array]这样的数组进行寻址?

时间:2019-06-20 09:51:18

标签: c

最近,我看到一个问题的答案,他们解释说,以<number>[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'

这种表示法对于包括作者在内的每个人来说似乎都很繁琐,并且可能造成混淆。

这种寻址数组的方式是否有合理的优势?

我可以继续生活而不用担心吗?

3 个答案:

答案 0 :(得分:7)

我从来没有在“真实代码”中遇到过这种情况(即,在人为限制的故意混淆的事物和困惑之外),因此似乎已经普遍同意不应该这样做。

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

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数组。我认为可以为这种情况提供更好的外观,或者在某些情况下,这是一种在其他地方进行最少编辑即可交换行和列(数组和索引)的方法。

答案 1 :(得分:6)

据我所知,这两种方法都没有技术上的利弊。它们是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)基本相同。如果您不小心写了=而不是==,则第一种方法会导致编译器错误。

  

我可以继续生活而不用担心吗?

是的。

答案 2 :(得分:2)

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