1

I came across this piece of code. In the cout statement the conditions evaluates to true.

   a[10][10]=’h’;
   cout<<(a[0]==*a)&&(*a==0[a]);

Accessing an array element/address using 0[a] is the new thing. Can somebody please explain this type of notation ?

4

3 回答 3

3

来自http://c-faq.com/aryptr/joke.html

问:我遇到了一些包含表达式 5["abcdef"] 的笑话代码。这怎么可能是合法的C?

答:是的,Virginia,数组下标在 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] ...
于 2013-01-05T14:25:28.990 回答
2

在 C 中,0[a]与 具有完全相同的含义a[0],并且都等价于*a。请参阅C 常见问题解答

只要a是指针,所有这些表达式在 C++ 中的语义与在 C 中的语义相同。

于 2013-01-05T14:24:01.287 回答
2

假设a是一个指向对象的指针,这些表达式总是相同的:

*a

0[a]

a[0]

这意味着这些表达式(a[0]==*a)(*a==0[a])也是相同的,并且都计算为1

于 2013-01-05T14:24:46.527 回答