2013-01-05 77 views
1

我碰到這段代碼。在cout聲明中,條件評估爲true。在C++中訪問2D數組的起始元素

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

使用0[a]訪問數組元素/地址是新事物。 有人可以請解釋這種符號?

+4

'COUT <<'是不是C. –

+3

數學家會說,它的工作原理,因爲加法是可交換的。 – axiom

+0

@PascalCuoq:我的不好。抱歉! – jairaj

回答

3

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

問:我碰到含有表達5 [ 「ABCDEF」]一些笑話代碼。這怎麼可能是合法的C? [腳註]這個好奇的事實源於數組下標的指針定義,即a [e]與*((a)+(e))是相同的。 ),對於任何兩個表達式a和e,只要其中一個是指針表達式而另一個是整數。該``證明'看起來像

a[e] 
*((a) + (e)) (by definition) 
*((e) + (a)) (by commutativity of addition) 
e[a]  (by definition) 

這沒有料到可交換經常用C文中提到,好像它是一件值得驕傲的,但它發現混淆的Ç大賽以外沒有任何有用的應用程序(參見問題20.36 )。由於C中的字符串是char數組,因此表達式「abcdef」[5]完全合法,並且計算結果爲字符'f'。你可以把它作爲一個速記

char *tmpptr = "abcdef"; 

... tmpptr[5] ... 
2

在C中,0[a]a[0]具有完全相同的含義,並且二者相當於*a。請參閱C FAQ

只要a是一個指針,所有這些表達式在C相同的語義++,因爲他們做在C.

2

假設a是一個指針到一個對象,這些表述是總是相同的:

*a 

0[a] 

a[0] 

這表示這些表達式(a[0]==*a)(*a==0[a])也是相同的,都評估爲1