C'deki dizi başlatmada köşeli parantezler ne anlama geliyor?


85

Burada ne anlamı [0x3A]var? Sadece şöyle ifadeler öğrendimint a[2] = {1, 2};


Büyük olasılıkla, belirli dizi girişlerini (belirli dizinlerde) geri kalanını doldurmadan başlatmanıza izin veren bir derleyici uzantısıdır.
Alexey Frunze

Yanıtlar:


81

Bu başlatma işlemini gerçekleştirmek anlamına gelir , n dizinin inci elemanı. Verdiğiniz örnek şu anlama gelecektir:

Bunlar "belirlenmiş başlatıcılar" olarak adlandırılır ve aslında C99 standardının parçasıdır. Ancak, olmadan sözdizimi =değildir. Bu sayfadan:

Bunun için GCC 2.5'ten beri kullanılmayan ancak GCC'nin hala kabul ettiği alternatif bir sözdizimi [index], öğe değerinden önce no =.


41

Göre GCC docs bu ISO C99 uyumludur. Buna "Atanmış Başlatıcılar" diyorlar:

Bir dizi indeksi belirtmek için, öğe değerinden önce "[index] = 'yazın. Örneğin,

eşdeğerdir

Bu sözdizimini daha önce hiç görmedim, ancak bunu gcc 4.4.5 ile -Wall ile derledim. Başarıyla derlendi ve hiçbir uyarı vermedi.

Bu örnekten de görebileceğiniz gibi, belirli dizi elemanlarını başlatmanıza izin vererek diğerlerini el değmeden bırakır.


15

Bu, C99'da tanıtıldı ve buna atanmış bir başlatıcı deniyor .

Temel olarak, geri kalanı varsayılan olarak bırakılarak bir dizide belirli değerleri ayarlamanıza izin verir.

Bu özel durumda, dizi indeksleri klavye tarama kodlarıdır. 0x3aolduğu belirlenmiş # 1'de tarama kodu için (bölüm 10.6 bakınız) CapsLocktuşu, 0x45olduğu NumLockve 0x46 olduğunu ScrollLock.

Yukarıdaki ilk bağlantıda şunu belirtir:

eşdeğerdir:

İlginçtir ki, bağlantı =gerekli olduğunu belirtse de , burada durum böyle görünmüyor.


13

Bu (yakın) belirlenmiş başlatıcıların sözdizimi , bir C99 özelliği.

Temel olarak, bir dizinin parçalarını başlatır, örneğin;

Dizinin ikinci değerini 6'ya ve üçüncüsünü 3'e başlatır.

Sizin durumunuzda, dizi uzaklıkları, dizinin 58'inci öğesini, muhtemelen gösterdiğiniz kodun üzerindeki kodda tanımlanan CAPSLOCK değerine başlatan onaltılık (0x3a) biçiminde olur.

Kodunuzdaki sürüm, =gcc'ye özgü bir uzantı gibi görünüyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.