3 回答

TA貢獻(xiàn)1811條經(jīng)驗 獲得超4個贊
是。6.5.2.1第1段(C99標(biāo)準(zhǔn))描述了[]運算符的參數(shù):
其中一個表達(dá)式的類型應(yīng)為“指向?qū)ο蟮闹羔榯ype”,另一個表達(dá)式的類型應(yīng)為整數(shù),結(jié)果的類型應(yīng)為“ type”。
6.5.2.1第2段(增加了重點):
表達(dá)式后跟方括號中的表達(dá)式[]是數(shù)組對象元素的下標(biāo)名稱。下標(biāo)操作符的定義[] 是E1[E2]相同(*((E1)+(E2)))。由于適用于二進(jìn)制+運算符的轉(zhuǎn)換規(guī)則,如果if E1是一個數(shù)組對象(相當(dāng)于一個指向數(shù)組對象的初始元素的指針)并且E2是一個整數(shù),E1[E2]則將其指定為E2-th元素E1(從零開始計數(shù))。
它說沒有什么要求參數(shù)的順序[]是理智的。

TA貢獻(xiàn)1845條經(jīng)驗 獲得超8個贊
通常,2[a]
它與a[2]
C 相同,并且保證在C和C ++中都是等效的(假定沒有運算符重載),因為正如您所指的那樣,它分別轉(zhuǎn)換為*(2+a)
或*(a+2)
。因為加號運算符是可交換的,所以兩種形式是等效的。
盡管這些形式是等效的,但為了所有神圣的事情(以及將來的維護(hù)程序員),請相對于其他形式更喜歡“ a [2]”形式。
PS,如果確實在面試中被問到此問題,請代表C / C ++社區(qū)進(jìn)行確切的復(fù)仇,并確保您要求面試官列出所有三字母組合序列,作為您給出答案的前提。也許這會使他/她將來不再提出這樣的問題(就實際編程而言毫無價值)。在奇怪的情況下,訪問員實際上知道所有三個字母組合序列,您總是可以嘗試對虛擬基類的銷毀順序提出質(zhì)疑,就像虛擬思維與日常編程毫無關(guān)系一樣。

TA貢獻(xiàn)1775條經(jīng)驗 獲得超8個贊
但在C ++中,您可以#define ARRAY_SIZE(a) (sizeof(a) / sizeof(0[a]))
用作宏來查找無法(也不能使其)工作的數(shù)組大小std::vector
以及[]
操作符重載的類型-這無法防止int *a = /*something*/; ARRAY_SIZE(a)
但對于任何事情都可以非常安全其他。(這是0[a]
我見過的唯一有用的用法)
- 3 回答
- 0 關(guān)注
- 682 瀏覽
添加回答
舉報