SORU
12 HAZİRAN 2009, Cuma


İndis üzerinden bir sonunun dizinin bir elemanının adresi: C ile yasal Standart değil mi?

Aşağıdaki kodu C Standardı tarafından izin verilmeyen birkaç kez iddia şimdi gördüm:

int array[5];
int *array_begin = &array[0];
int *array_end = &array[5];

&array[5] hukuk C kodu bu bağlamda?

Mümkünse Standart bir başvuru ile bir cevap istiyorum.

Ayrıca eğer C standardına uygun olup olmadığını bilmek ilginç olurdu. Ve eğer standart C değil. öyleyse neden bu kararı farklı bir şekilde array 5 &array[4] 1 tedavi etmek için yapıldı?

CEVAP
12 HAZİRAN 2009, Cuma


Evet, yasal. C99 draft standard:

Madde 6.5.2.1, paragraf 2:

Postfix bir ifadeyi köşeli parantez içinde bir ifade [] ardından bir alt. bir dizinin bir öğesi belirlenmesi nesne. İndis operatörü *6 tanımı* E1[E2] (*((E1) (E2))). aynı olan. Dönüştürme kuralları için E1 dizi bir nesne (benzer şekilde, bir işaretçi ikili işleç uygulamak, bir dizi nesnenin ilk element) ve E2 bir tamsayı E1[E2] E2-inci atar. E1 element (sıfır dahil).

Madde 6.5.3.2, paragraf 3 (vurgu benim):

& tekli operatörü işlenen adresini verir. Eğer işlenen türü varsa ‘yazın’, sonuç ‘işaretçi tipi vardır ^em>yazın’. Eğer işlenen * tekli bir operatör sonucu ise, ne & operatör bu operatör değerlendirilir ve sonuç hem sanki ne operatörler kısıtlamalar hala geçerli ve sonuç bir o kadar harika değil ihmal lvalue. Aynı şekildeeğer ifadenin sonucu bir [] operatör, ne & operatörü ne tekli * olduğunu ima [] değerlendirilir ve sonuç olarak & operatör çıkarıldı ve [] operatör bir operatör için değiştirildi. Aksi takdirde sonuç. nesne veya işlev belirlenmiş işlenen bir işaretçi.

§6.5.6, paragraf 8:

Tamsayı türü olan bir deyim eklendi veya bir işaretçi çıkartılır, sonuç işaretçi işlenen türü vardır. Eğer işaretçi işlenen bir elemanına işaret ediyorsa bir dizi nesne ve dizi yeterince büyük, sonuç unsuru uzaklığı puan sonuç ve orijinal alt simgeler farkı böyle özgün öğesi dizi elemanları tamsayı ifadesi eşittir. P ifade noktalarına, diğer bir deyişle, i-inci dizi nesnenin öğesi, ifadeleri (P) N (benzer N (P)) ve (P)-N N 30 ** değeri (), sırasıyla, i ninci i−n-inci öğeler için işaret dizi, bulunması koşuluyla nesne. P ifade puan son için ayrıca dizi bir nesne, ifade (P) 1 öğesi, son öğe geçmiş bir puan eğer ifade Q dizi nesnenin son öğe geçen bir işaret,bir dizi nesne ve ifade, dizinin son öğesi için (Q)-1 puan nesne. Her iki işaretçi varsa işlenen ve sonuç aynı dizi nesnesinin elemanları, ya da geçen son bir nokta dizi öğesi, değerlendirme taşma üretmek olmamalıdır; aksi halde, nesnenin davranış tanımsızdır. Eğer sonuç dizi nesne, son öğe geçen bir işaret değerlendirilir * tekli bir operatör işleneni olarak kullanılamaz.

Standart açıkça işaretçileri dizinin sonunun bir eleman noktası, izin verdiğini unutmayınonlar başvuru yapıldı . sağlanan . 6.5.2.1 ve 6.5.3.2, ifade &array[5] dizinin sonunun bir işaret (array 5) eşdeğer &*(array 5) eşdeğer. Bu yasal bir başvuru (6.5.3.2) neden olmaz.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Le Cargo !

    Le Cargo !

    24 HAZİRAN 2007
  • Matthew Morrill

    Matthew Morr

    15 EKİM 2011
  • WOSU Public Media

    WOSU Public

    23 AĞUSTOS 2007