Здравствуйте, 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-ами.
Паттерн-матчинг, конечно, круче, но про него в контексте Ц говорить, наверное, не очень уместно.