2011-09-30 18 views
9

Bu aşırı basit soru için üzgünüm ama ben okuyorum kitapta bu örneği anlamaya görünüyor olamaz:Bu Snippet'i (Neden bu parantezler burada) açıklayabilir mi?

void f5() 
{ 
    int x; 
    { 
     int y; 
    } 
} 

için int y çevreleyen ayraçları nelerdir? Diş tellerini istediğin yere koyabilir misin? Eğer öyleyse, ne zaman ve neden böyle yaparsınız yoksa bu kitaptaki bir hata mıdır?

+2

Bu, ilk ifadeden sonra yerel geçici değerler oluşturmak için çoğunlukla C dilinde uygulanan bir tekniktir. Yürütme, bitişik kaşlı ayraçtan çıktığında, bu kapsamda oluşturulan tüm değişkenler kaybolur. –

cevap

13

Bu gibi diş telleri, parantez içindeki kodun artık farklı bir kapsamda olduğunu gösterir. Yana parantez dışında erişmeye çalıştıysanız, bir hata alırsınız.

+0

Bu mantıklı, ama kafamı karıştıran şey bunun bir fonksiyonun içinde olması gerektiğini düşündüm. Bir fonksiyonu içine diş tellerini yerleştirebilirseniz, neden iç içe geçmiş bir işlevi kullanmak zorunda kaldığınızı göremiyorum - Ya da ben bir yerde sol alanda mıyım? – Gary

+4

Bir işlevin kendi kapsamı vardır, ancak kapsamı bir işlev içinde de olabilir. Bu çok yararlı olabilir, örneğin C++ nesneleri yıkıcılara sahiptir ve bunlar, nesnenin kapsam dışına çıktığı durumlarda, bir parikende kaynakları serbest bırakmak için kullanılabilir. Bu orta işlevi yapmak isteyebilirsiniz. – Benj

4

Bu, kapsamı tanımlamaktadır. Y değişkeninin diş tellerinin dışında erişilebilir değil.

4

Parantezler kapsamı gösterir, x değişkeni iç parantezin kapsamı içinde görünecektir, ancak y'nin brace kapsamı dışında görünmeyecektir.

3

Parantezler bir kapsam seviyesi tanımlar. Diş tellerinin dışında y mevcut olmayacaktır. O parantez içindeki değer y kutulu olduğunu yapmamak bir hata (bağlamını bilmeden)

benziyor ve bu nedenle

1

bunun dışında kullanılabilir DEĞİLDİR. İç nesneler tahrip edilir kapsam çıkışta

void f5() 
{ 
    int x = 1; 
    { 
     int y = 3; 
     y = y + x;   // works 
     x = x + y;   // works 
    } 
    y = y + x;    // fails 
    x = x + y;    // fails 
} 
6

Bu kapsam değişkenlerin meselesi, örneğin olabilir . Örneğin, parantez içinde kritik bir bölüm ekleyebilir ve orada bir kilit nesnesi oluşturabilirsiniz. Sonra kilidini açmayı unutmaktan endişe etmenize gerek yok - normalde veya bir istisna nedeniyle, yok edici otomatik olarak kapsam dışına çıkıldığında çağrılır.

3

: bunlar kapsamını açıklamak çalışıyorsanız Elbette

, bu geçerli bir kod

İlgili konular