2013-05-06 25 views
5

Ben şaşırtıcı Aşağıdaki kod tamamen geçerli olduğunu bugün keşfetti (gcc 4.4.5) (parametresi ise blokta gölgelendirilmeyen). Eğer kabul etmeliysem, yeni değişkenin kendi bloğu içerisindeymiş gibi olduğunu anlayabildiğime emin olabilirim, bu yüzden dışarıdaki kodun geri kalanı parametreye hala erişebilir, böylece parametre gerçekten gölgelenmez. Ama yine de bana mantıklı gelmiyor, neden bunu geçersiz bir sözdizimi yapmıyoruz? Buna izin vermenin faydalarını görmüyorum ve aslında, bunun neden olduğu bir hatayı kazmak zorunda kaldım. Bu uzun bir işlevdi ve kendi değişkenimi, bir parametre ile aynı ada sahip olduğunu fark etmeden oluşturdum ve sonradan bazı kod satırları (aynı blok) o parametre değişkeni üzerinde bir bağımlılık var ve şimdi benim versiyonumu kullanıyorum. ve benim günümden bir saat geçiyor.İlginç vaka

Derleyicilerle ilgili çok yüzey bilgim var, bu yüzden birisi bana bu davranışın ardındaki hikayeyi anlatabilir mi? Bir karşılaştırma olarak, Java kodunda bu şekilde geçersizdir (yinelenen değişken).

+0

Derleyicilerde uzman değil, ama argümanın bir int & ve "gölgelendirme" değişkeni olduğundan sadece buradaki döngüde olması gerektiğinden şüpheleniyorum. –

+0

Ayrıca get_int (int i) 'yi denedim, farketmez – user1861088

+5

"int i" nin kapsamı, bildirildiği bloktur. Bu, bloğun içindeki parametreyi gölgeler, ancak bunun dışında gölgelendirir. "Neden işlev yerine blok için bir kapsam oluşturuldu?" Cevap "Dil kuralları böyle der." Farklı diller farklı kurallar izler. Onları farklı kılan budur. –

cevap

1

"Bir referans olan argümanının değerini değiştirmek gerekiyordu bir işlevi uygulamak için kullanılabilir" , cevap basit: geçerli C kodunu kabul etmek için.

Ayrıca, aynı kapsamdaki farklı tanımlayıcıları aynı şekilde, kapsamları adlar, sınıflar, işlevler veya engelleme kapsamları olup olmadığına bakmadan, farklı anlamları ele almak, kuralları daha basit hale getirir.

+0

aklını biraz daha açıklayan bir fark yaratmayacak mıydı? Bunun geçerli bir C kodunu kabul etmenin nasıl bir şey olduğunu nasıl gösterebilirdiniz? – user1861088

+0

C++ 'nın popülaritesi, C++ kurallarının hemen hemen tüm iyi C kodlarının kabul edilebilir olması gerçeğine dayanıyordu. –

-4

Bir değişkeni, ancak bir başvuru geçirmiyorsunuz. Bjarne Stroustroup aktaran C++ programlama dili - C++ bu tanır neden soruyorsan s.62

+0

Bu, "Neden bir parametreyi kısmen gölgelemeye izinliyim?" Sorusunun noktasını özlüyor. –

+0

soruyu anlamadın .. üzgünüm daha net bir şekilde koymadım. Ayrıca bir const başvuruda geçtim, bu yüzden – user1861088