我遇到了这段代码。在cout语句中,条件评估为true。
a[10][10]=’h’;
cout<<(a[0]==*a)&&(*a==0[a]);
使用0[a]
访问数组元素/地址是新事物。
有人可以解释一下这种表示法吗?
答案 0 :(得分:3)
来自http://c-faq.com/aryptr/joke.html
问:我遇到了一些包含表达式5 [“abcdef”]的笑话代码。这怎么可能是合法的C?答:是的,弗吉尼亚州,数组下标在C中是可交换的。[脚注]这个奇怪的事实来自数组下标的指针定义,即a [e]与*((a)+(e)相同,对于任何两个表达式a和e,只要其中一个是指针表达式而一个是整数。 “证据”看起来像
a[e]
*((a) + (e)) (by definition)
*((e) + (a)) (by commutativity of addition)
e[a] (by definition)
这种毫无疑问的交换性在C文本中经常被提及,好像它是值得骄傲的东西,但它在混淆的C竞赛之外找不到有用的应用(见问题20.36)。
由于C中的字符串是char数组,因此表达式“abcdef”[5]完全合法,并且计算字符“f”。您可以将其视为
的简写char *tmpptr = "abcdef";
... tmpptr[5] ...
答案 1 :(得分:2)
在C中,0[a]
与a[0]
具有完全相同的含义,两者都等同于*a
。请参阅C FAQ。
只要a
是一个指针,所有这些表达式在C ++中的语义与在C中的语义相同。
答案 2 :(得分:2)
假设a
是指向对象的指针,这些表达式总是相同的:
*a
0[a]
a[0]
这意味着这些表达式(a[0]==*a)
和(*a==0[a])
也是相同的,并且都评估为1
。