最近,我看到一个问题的答案,他们解释说,以<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'
这种表示法对于包括作者在内的每个人来说似乎都很繁琐,并且可能造成混淆。
这种寻址数组的方式是否有合理的优势?
或
我可以继续生活而不用担心吗?
答案 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比赛,则必须使用它。