Удаление символа из массива циклом for
Выполняя домашнее задние нашла на просторах интернета такую строчку кода for (int j = i + 1; str[j - 1] = str[j]; ++j);. Она удаляет символ и прекрасно вписывается в функцию, которая удаляет символы до пробела:
void deleteWords(char str[], int size, char ch1, char ch2) {
// Инициализирована переменная конца строки
char endOfStr = '11';
// Перебор str
for (int i = 0; i < size; i++) {
// Если искомый символ найден и это первая буква в слове/начало массива
if ((str[i] == ch1 or str[i] == ch2) and (str[i - 1] == ' ' or i - 1 <= 0))
// то удаляем символы до пробела
while (str[i] != ' ') {
for (int j = i + 1; str[j - 1] = str[j]; ++j);
// Если элемент есть конец строки, то выход
if (str[i] == endOfStr)
break;
}
}
}
Но, я не совсем понимаю, как именно она работает? Почему на месте, где обычно пишется условие выхода из цикла, в этом примере присваивание? Может кто-нибудь пошагово описать (или подробно объяснить) алгоритм работы этой строчки?
Если конкретнее, то мне интересна именно сточка for (int i + 1; str[j - 1] = str[j]; ++j). Она работает и без цикла while и удаляет один символ. В цикл while я положила его сама, чтобы он искал пробел и выходил из цикла при обнаружении конца строки. Эта строчка полноценна и если ее освободить от while, то она все равно будет работать, только удалять 1 символ, вместо "слова". И вот интересно, как именно это происходит. Каким образом эта команда str[j - 1] = str[j] одновременно является условием цикла и инструментом удаления символа.
Ответы (2 шт):
Совершенно обычный цикл, просто проверка условия продолжения цикла на истину (не равенство нулю, в случае если на истину проверяется число) происходит после присваивания str[j - 1] = str[j]. Цикл работает, пока не встретится конец строки (обозначаемый символом с кодом 0, насколько я помню C/C++). Конец строки тоже скопируется, после чего произойдёт проверка, что же мы там скопировали/присвоили, обнаружится 0, и цикл закончится.
Давайте рассмотрим ваш цикл подробнее
for (int j = i + 1; str[j - 1] = str[j]; ++j);
Как вообще работает такой цикл?
for( инициализация; условие; действие);
Примерно - пока верно условие, выполнять действие.
Какое же у нас условие и как оно вычисляется?
str[j-1] = str[j]
Т.е. в условии выполняется присваивание. Но в С/С++ результатом присваивания является присвоенное значение. Не приходилось видеть что-то типа
x = y = 5;
Т.е. присваиваем 5 переменной y, результат, равный 5? присваиваем переменной x. Так и здесь - после присваивания это все выражение имеет значение, равное только что присвоенному. Примерно как если бы у вас было составное условие:
str[j-1] = str[j];
str[j-1]
Но условие str[j-1] в силу приведения к логическому значению (0 - ложь, не 0 - истина) фактически эквивалентно условию str[j-1] != 0.
Таким образом, в цикле выполняется присваивание до тех пор, пока очередной присвоенный символ не будет нулевым, т.е. концом строки.
Так понятнее?