Re[2]: семантика switch/case
От: AlexRK  
Дата: 30.12.15 07:58
Оценка: +2
Здравствуйте, maxluzin, Вы писали:

M>В известной книжке отцов-основателей языка "С" Кернигана и Ритчи в главе 3.4 приводится такой пример:


Вот не понимаю, почему нельзя было сделать так, без этих break-костылей (разумеется, это не валидная программа на C):

#include <stdio.h>
main() /* подсчет цифр, символов-разделителей и прочих символов */
{
    int c, i, nwhite, nother, ndigit[10];
    nwhite = nother = 0;
    for (i = 0; i < 10; i++)
        ndigit[i] = 0;
    while ((с = getchar()) != EOF) {
        switch (c) {
        case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
            ndigit[c - '0']++;
        case ' ', '\n', '\t':
            nwhite++;
        default:
            nother++;
        }
    }
    printf ("цифр =");
    for (i = 0; i < 10; i++)
        printf (" %d", ndigit[i]);
    printf(", символов-разделителей = %d, прочих = %d\n",
            nwhite, nother);
    return 0;
}


Проще, короче, нагляднее, безопаснее.
Если обработчики веток совпадают лишь частично, внутри таких веток можно уже разрулить if-ами.
Паттерн-матчинг, конечно, круче, но про него в контексте Ц говорить, наверное, не очень уместно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.