О заменяемости циклов :)
Ну вот теперь, доведя формулировки до более-менее ясных, можно и публиковать, а то юный падаван сомневался :)
1. Существует ли допустимое "условие" для которого 3 показанных кода неэквивалентны?
while (условие) { //тело цикла } do { if (!условие) break; //тело цикла } while (1); for (;условие;) { //тело цикла }
Язык - C/C++ или другой Си-подобный, разрешены break
и continue
.
Нет, не существует, если придерживаться соглашения, что "условие", то есть, управляющая переменная, меняется одинаково во всех вариантах записи. "Тело цикла" состоит из одних и тех же операторов в одном и том же порядке, например, ставить в do
оператор break
в другое место не разрешается. Безотносительно к тому, как именно управляющая переменная меняется в теле цикла, она меняется там одинаково.
2. По сути, тот же вопрос, но другими словами. Всегда ли можно обойтись любым из 3 операторов for
, while
или do-while
, не привлекая двух других операторов? Логично, что всегда. for
и while
полностью взаимозаменяемы, а do-while
можно заменить любым из них по типу
do { //тело цикла } while (условие); на for (;;) { //тело цикла if (!условие) break; } и while (1) { //тело цикла if (!условие) break; }
Можно всегда, если подразумеваются круглые скобки вокруг "условия". Если же задача дана as is и наличие круглых скобок в "условии" считается частью условия, то любое выражение, в котором оператор !
приводит к изменению приоритета операций и, соответственно "!условие
" не будет инверсией "условия" и однозначность ответа нарушится :)
21.10.2015, 22:10 [5792 просмотра]