БлогNot. О заменяемости циклов :)

О заменяемости циклов :)

Ну вот теперь, доведя формулировки до более-менее ясных, можно и публиковать, а то юный падаван сомневался :)

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 [5782 просмотра]


теги: c++ философия программирование

К этой статье пока нет комментариев, Ваш будет первым