Почему нельзя учить детей языку Си/Си++
Один очень-переочень можно даже сказать
самый известный на RSDN человек, не будем показывать на него пальцем, привел вот такой образец кода:
Заметьте, цикл for — с выделенными предикатом проверки и выражением итерирования. А не while, где это итерирование засунуто бог весть куда (что, кстати, не только читаемость ухудшает, но и даёт возможность для ошибок)
// сравните
for(init(); cond(); next())
{
work1();
if(x()) continue;
if(y()) continue;
work2();
}
// с неправильным
init();
while(cond())
{
work1();
if(x()) continue;
if(y()) continue;
work2();
next();
}
// и правильным, но громоздким (лишний код)
init();
while(cond())
{
work1();
if(x()) { next(); continue; }
if(y()) { next(); continue; }
work2();
next();
}
// или ещё более громозким (лишняя переменная, лишний текст)
init();
bool secondary=false;
while(true)
{
if(secondary) next(); else secondary=true;
if(!cond()) break;
work1();
if(x()) continue;
if(y()) continue;
work2();
}
На паскале специально не написал — синтаксис более громоздкий. Но идея и так видна.
Вот такие дела.
Сначала небольшой разбор полетов. Вспомним что есть такое конструкция WHILE:
WHILE b DO S END
Что у нас есть в данном случае "b"? Элементарно b — это:
" cond() ", значит наша программа принимает следующий вид
init()
WHILE cond() DO S END
Теперь задумаемся, что в нашем случае есть S? Опять элементарно S — это:
" WORK(); next() " так и запишем нашу программу:
init()
WHILE cond() DO
WORK();
next()
END
И, наконец, третий и последний шаг. Задумаемся, что в нашем случае есть WORK()? Опять, же, элементарно, WORK() в нашем случае есть:
" work1(); IF ~x() & ~y() THEN work2() END " (логическое выражение вычисляется слева на право, если ~x() ложно, то значение y() не вычисляется). Так и пишем:
init();
WHILE cond() DO
work1(); IF ~x() & ~y() THEN work2() END;
next()
END
То что я только что тут по шагам проделал называется структурное программирование. Этому надо обучать в школе. Это азбука программирования! После того как уважаемые люди пишут такую программу через continue я считаю, что у меня развязаны руки. Я теперь могу показывая пальцем на этот код аргументированно утверждать что увлечение языком Си/Си++ до добра не доводит, вот пожалуйста — человек в трех соснах заблудился, написал два continue и еще утверждает, что так и надо!
26.10.04 16:23: Перенесено из 'Философия программирования'