Diller neden switch deyimlerinde açık düşüşü kullanmıyor?


17

Ben okuyordum biz kullanımına var Neden breakiçinde switch? ve bazı durumlarda (PHP ve JavaScript gibi) örtük düşüşe neden izin verildiğini merak etmeme neden olurken açık düşüş için destek (AFAIK) yoktu.

Yeni bir anahtar kelimenin oluşturulması gerektiği gibi continue, tam olarak uygun olacağı gibi değil ve yazarın bir davanın düşmesi anlamına gelip gelmediği konusundaki belirsizlik sorunlarını çözecekti.

Şu anda desteklenen form:

switch (s) {
    case 1:
        ...
        break;
    case 2:
        ... //ambiguous, was break forgotten?
    case 3:
        ...
        break;
    default:
        ...
        break;
}

Oysa bunun şöyle yazılması mantıklı olacaktır:

switch (s) {
    case 1:
        ...
        break;
    case 2:
        ...
        continue; //unambiguous, the author was explicit
    case 3:
        ...
        break;
    default:
        ...
        break;
}

Bu sorunun amaçları için, düşmelerin iyi bir kodlama stili olup olmadığı konusunu görmezden gelelim.

Düşüşe izin veren ve onu açıkça ortaya koyan herhangi bir dil var mı?

switchAçık yerine örtülü düşmeye izin veren tarihsel nedenler var mı?


4
C # ile açık olmasını gerektirir goto case, bu yüzden sorunuzun öncülünün biraz yanlış olması gerekir.
pdr

1
@pdr, çok açık bir şekilde düşmeyi destekleyen herhangi bir dil olup olmadığını sordum goto case, C # ' da farkında değildim .
zzzzBov

Evet, üzgünüm, sorunuzun iki kısmı olduğunu özledim. Ne yazık ki, olduğu gibi ifade, ben oylama sorusuna çok yakın çünkü kapatmak için oy ediyorum. Çok sayıda doğru cevap olacak.
pdr

C # aynı zamanda birden fazla etiketin aynı deyim listesini paylaşmasına izin verir, bu da düşme gerektiren bazı durumları kaldırır. Geri kalanı için, goto casepdr'den bahsedildiği gibi.
Brian

Yanıtlar:


20

Öncelikle tarihi, çoğu dil C'nin yaptıklarını kopyaladı.

C'nin bunu yapmasının nedeni, C ifadesinin yaratıcılarının geçiş tablosuna optimize edilmesinin kolay olmasını amaçlamasıydı. C'nin ifadeleri integral değerlerle sınırlandırmasının nedeni de budur.

Bir atlama tablosunda, program ifadeye göre hangi konuma atlayacağınızı hesaplar. Program o noktaya atlayacak ve daha sonra bu noktadan itibaren çalışmaya devam edecektir. Tablonun geri kalanını atlamak istiyorsanız, tablonun sonuna bir atlama eklemeniz gerekir. C, breakbu yapıya doğrudan bir yazışma olması için açık ifadeler kullanır .


7
Küçük bir not olarak, "Uzman C Programlama" kitabında Peter van der Linden, C derleyicisinde Sun için çalışırken, anahtar durumlarının yaklaşık% 97'sinin içerdiğini breakve sadece% 3'ünden azının düştüğünü belirtti . Daha sonra bunu, varsayılan düşme davranışının karşı sezgisel olduğunu ve tersine çevirmenin daha iyi olacağını bir örnek olarak kullandı (açık düşmeyi belirtmek için bir anahtar kelime kullanın). Oh, ve kitap C'nin diğer tuhaflıklarını da açıklamakta gerçekten harika, bazıları C ++ ve hatta C # ve Java'da da var! Her şey B ve BCPL'ye dayanıyor. :)
zxcdw

3
C # ( msdn.microsoft.com/en-us/library/06tc147t(v=vs.71).aspx ) gibi düşüşün açık olduğu programlama dilleri vardır . Öte yandan, kırma c # 'da da açıktır.
linkerro

@zxcdw: Çok kötü, küçük bir kuşun zamana geri dönmesinin ve ilkinden farklı olarak işaretlenmiş herhangi bir etiketin caseotomatik olarak ön eke sahip olmasını önermesi break, ancak işaretli olanların +case(veya bu tür başka bir işaretleyicinin) önermemesinin bir yolu yoktur . Bir derleyicinin işlemesi kolay olurdu ve mevcut düzenlemenin anlamsal avantajlarına izin verirken, birçok kod satırını ortadan kaldırırdı.
supercat

7

Go, fallthroughanahtar kelimeyi kullanarak açık bir aralığa izin verir (ara kapalı, ancak açık olabilir):

switch val {
case 1: // breaks
case 2:
    fallthrough
case 3:
    goto 
case 4, 5, 6: // equivalent to defining individual cases with explicit fallthough
    break // unnecessary
default:
}

İşte etkili go ve dil özelliklerinden ilgili bit .

gotoBelirli bir vakaya gitmek için kullanabileceğinizi sanmıyorum , ancak davanın içinde bir etiket yapabilir ve gotobenzer bir normal kullanabilirsiniz .

Bonus olarak, Go bir anahtardaki ikili ifadeleri, dizeleri veya türleri büyük / küçük harf ifadeleri olarak kullanmanızı sağlar.

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.