最近,我看到一个问题的答案,他们解释说,以这种方式寻址数组<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)
对于包括作者在内的每个人来说,这种表示法似乎都很麻烦并且可能会造成混淆。
这种寻址数组的方式是否具有某些合理的优势?
要么
我可以继续生活而不用担心吗?
我从来没有在“真实代码”中遇到过这种情况(即,在人为限制的故意混淆的事物和困惑之外),因此似乎已经普遍同意不应该这样做。
但是,我可以提出一个人为的示例,其中某些人(不一定是我)可以认为它是一种更好的语法:如果您在列中具有与单个实体相关的多个数据,并且将行表示为不同的数组:
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在大多数情况下,我更喜欢数组。我认为可以为这种情况提供更好的外观,或者在某些情况下,这是一种在其他地方进行最少编辑即可交换行和列(数组和索引)的方法。
据我所知,这两种方法都没有技术上的利弊。它们是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)。如果您不小心写=而不是写入==,则第一种方法会出现编译器错误。
我可以继续生活而不用担心吗?
是。