SORU
14 Kasım 2011, PAZARTESİ


Yararlı bir durum parantez olmadan bir switch deyimini kullanarak var mı?

&S5 H "en tuhaf" deyimi switch (8.7.1, s. karşılaştığım 277) parantez. kullanmıyor
İşte bir örnek:

switch (x)
    default:
    if (prime(x))
        case 2: case 3: case 5: case 7:
            process_prime(x);
    else
        case 4: case 6: case 8: case 9: case 10:
            process_composite(x);

Fikri en yaygın küçük numaralar için prime(x) yükünü önlemek için gibi görünüyor.

Bu ifadeyi görünce, eksik parantezler hakkında kafam karışıktı, ama resmi dilbilgisi (C1X pre-standard, 6.8.4, p kontrol ediyorum. 147), sözdizimi doğru: geçiş deyimi sadece anahtarı sonra bir açıklama ve kapanış parantez ifadesi vardır.

Ama programlama benim uygulamada bir daha hiç meraklı geçiş böyle bir açıklama karşılaştı (ve sorumluluğunu almak zorunda olduğum kod içinde görmek istemem), ama merak etmeye başladım:

Sen bu tür bir switch ifadesi, parantez kullanarak, ama hala anlam olmadan kimse bilemez? Sadece switch (i); hukuki değil, ama bir NOP (), ama en azından iki vaka etiketler yararlı bir amacı olmasını kullanarak?

CEVAP
14 Kasım 2011, PAZARTESİ


Eğer makroları kontrol yapıları kullanıyorsanız if yerine switch else sarkan sorun olduğu için kullanışlı geliyor.

#define DEBUG_PRINT(...) switch (!debug_mode) case 0: fprintf(__VA_ARGS__)

Bu ise makro bir kullanıcı ek bir koşul bu koyar sürprizler yok

if (unclear) DEBUG_PRINT(stderr, "This is really %unclear\n", unclear);
else {
 // do something reasonable here
}

Böyle bir hata ayıklama makro her zaman derlenmiş olma avantajı (ve sonunda optimize edilmiş). Hata ayıklama kodu programın tüm canlı zamana kadar geçerli kalır.

Ayrıca switch {}, if/else örnek ya da işe yaramaz aksi halde kullanmayan önemli olduğunu burada inceleyin. Tüm bu diğer yöntemlerle elde edilebilir (if/else , (void)0 do/while hileler) ama bu benim bildiğim en güvenli olanıdır.

Ve beni almayın, herkes kontrol yapıları içinde kullanması gerektiğini söylemiyorum yanlış makrolar, kesinlikle ne yaptığını biliyor. Ama haklı olduğu durumlar vardır.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • CNNMoney

    CNNMoney

    16 Kasım 2006
  • KendrickLamarVEVO

    KendrickLama

    9 ŞUBAT 2011
  • xiaoyu85

    xiaoyu85

    20 ŞUBAT 2010