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

7Pi*_*cia 6 c

最近,我看到一个问题的答案,他们解释说,以这种方式寻址数组<number>[array]是有效的C代码。 方括号在C中如何工作?

例:

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

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

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

要么

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

Ark*_*kku 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]);
Run Code Online (Sandbox Code Playgroud)

我将是第一个同意这样的语法,它使人们看起来是数组而不是索引,从而使语法变得模糊,struct在大多数情况下,我更喜欢数组。我认为可以为这种情况提供更好的外观,或者在某些情况下,这是一种在其他地方进行最少编辑即可交换行和列(数组和索引)的方法。

  • 我认为最危险的事情是看起来合理。:D (3认同)
  • 嗯,有趣的用例...假设具有ROM和RAM的特殊体系结构,以及具有const和可变成员的数据集。使用structs,我们需要将所有内容放入RAM中,并使用单独的数组,我们可以将const部分放入ROM中,而仅将可变部分保留在RAM中... (2认同)

klu*_*utt 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)。如果您不小心写=而不是写入==,则第一种方法会出现编译器错误。

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

是。