2008-10-24 19 views
5

C ve C++ 'da aşağıdaki açıklamalar ne yapıyor?C'deki bu beyanlar arasındaki fark nedir?

const int * i; 
int * const i; 
const volatile int ip; 
const int *i; 

Yukarıdaki beyanlardan herhangi biri yanlış mı?

Aralarındaki anlam ve farklılıklar nedir?

yukarıdaki beyanların yararlı kullanımları (biz C/C++/gömülü C onları kullanmak zorunda olan durumda ortalama) nelerdir?

+0

Dilbilgisi ve yazım için düzenleyecekseniz, neden bir "ben" yazarak "If" yazıp "!" Yazmıyorsunuz? – Eclipse

cevap

34

const int * i;

i tamsayı sabit bir işaretçidir. i farklı bir değere işaret etmek için değiştirilebilir, ancak i ile işaret edilen değer değiştirilemez.

int * const i;

i sabit olmayan bir tamsayıya sabit bir işaretçidir. i ile işaret edilen değer değiştirilebilir, ancak i farklı bir değere işaret edecek şekilde değiştirilemez.

const volatile int ip;

Bu seferki biraz zordur. ip'un const olduğu gerçeği, derleyicinin ip değerini değiştirmenize izin vermeyeceği anlamına gelir. Bununla birlikte, teoride, örn. adresini alarak ve const_cast operatörünü kullanarak. Bu çok tehlikeli ve iyi bir fikir değil, ama izin verilir. volatile niteleyici, her zaman ip'a erişildiğini, her zaman belleğinden yeniden yüklenmesi gerektiğini, yani bir kayıtta saklanmaması gerektiğini belirtir. Bu, derleyicinin belirli optimizasyonları yapmasını engeller. volatile niteleyicisini, başka bir iş parçacığı tarafından değiştirilmiş olabilecek bir değişkeniniz olduğunda veya bellek eşlemeli G/Ç kullanıyorsanız veya derleyicinin beklemeyeceği davranışa neden olabilecek diğer benzer durumlarla kullanmak istediğinizde. Aynı değişkeni const ve volatile kullanarak oldukça sıra dışı (ancak yasal) - genellikle birini görürsünüz ama diğerini değil.

const int *i;

Bu ilk bildiriminde aynıdır.

+0

Salt okunur değerin başka bir iş parçacığında yapılan değişiklikleri yansıtacak şekilde ayarlandığından emin misiniz? Hangi uygulamalarda? Uyumlu olmayan önbelleklere sahip çok çekirdekli mimarilerden ne haber? –

+1

Bir değişken ** ** const 'olarak bildirilirse (' ip 'buradadır), değeri değiştirmek için 'const'' const_cast' ile kaldırmak için tanımlanmamış bir davranıştır. Ayrıca, uçucu başka bir iş parçacığı için görünür değişiklikler yapmak için garanti edilmez. Belirli derleyiciler bu garantiyi yapabilirler. –

+0

Anthony tamamen haklı. Uçucu değişken değişkenliğinizi farketmez. Ayrıca, bir const bildirilen const'dan const casting undefined behaivor. –

4

C/C++ 'da sağdan sola değişken değişken bildirimlerini okuduğunuz halde okursunuz.

const int *i; // pointer to a constant int (the integer value doesn't change) 

int *const i; // constant pointer to an int (what i points to doesn't change) 

const volatile int ip; // a constant integer whose value will never be cached by the system 

Her birinin kendi amaçları vardır. Herhangi bir C++ ders kitabı veya yarı iyi kaynak, her birinin açıklamalarına sahip olacaktır.