C/C++

Язык С. Что значит данная конструкция? while(*s++=*c++) Заранее спасибо!

Всего кода нету. Я так поняла указатель s инкрементируют и приравнивают к указателю с который тоже инкрементируется. И цикл выполняется пока инкрементируемый указатель s приравнивается к инкрементируемому указателю с? Но мне кажется у меня неправильное понимание, так как никто не приравнивает в цикле ничего, а второе даже если бы и приравнивали то цикл был бы бесконечным... Объясните что это значит, пожалуйста.

Доброго дня.
Цикл пока значение по указателю s равен значению по указателю c!
Как неравно, так выходим.
Акира Ок Да
Акира Ок Да
79 690
Лучший ответ
Денис Овчинников А разве оператор сравнения, это не двойное равно?
Строки в С ноль-терминированные. Это значит, что за конец строки принимается код нуля. Выражение условия цикла while возвращает два возможных значения: истина либо ложь. В языке С булевого типа нет, поэтому вычисление значения выражения сравнения неявно приводится к типу int, и если оно равно 0, то возвращается FALSE, что для цикла while означает дальнейшее его прекращение, во всех остальных случаях возвращается TRUE и выполнение цикла продолжается. В вашем случае, в зависимости от задачи, в условии цикла выполняется поиск конца строки либо поиск нуля в массиве путём посимвольного либо поэлементного сравнения их значений путём разыменования указателей. В случае с поиском нулевого элемента в массиве возможен выход за пределы массива. В случае со строкой, код гарантирует, что достигнет конца строки и прекратит дальнейшее выполнение, то есть операторы постфиксного инкремента выполнять уже не будут. Постфиксный инкремент, применяемый к указателям в условии цикла, позволяет сначала присвоить значение по разыменованым указателям, а затем переместить их на очередные символы строки либо ячейки элементов в массиве. Ваш код предназначен для посимвольного копирования одной строки в другую. Но в этом случае буфер под строку, на которую указывает указатель s должен быть не меньше, чем размер копируемой в него строки с учётом 0-терминатора. В данном случае буфер является символьным массивом (статическим либо динамическим), а строка может быть как аналогичными массивами, с обязательным нулём на конце, так и строковым литералом. И ваш код можно переписать следующим способом:

while(*s = *c) {
++s;
++c;
}

Как видите никаких дополнительных инкрементов после выхода из цикла я не пишу, потому что в инструкции while (*s++ = *c++) по достижении 0-терминатора, постфиксный инкремент не выполнится, так как цикл прервётся раньше. Порядок выполнения операций в условии цикла следующий: разыменование указателей, присваивание значения, логическое сравнение, постфиксные инкременты.
Baiysh Stamkulov
Baiysh Stamkulov
52 797
Денис Овчинников Спасибо Вам огромное!)
у меня компилятор на ++ выдает ошибку.. а без этого, при достижении 0 выход из цикла
1. Выражение (*s = *c) == *c. И пока (*s = *c) != 0, цикл будет выполняться.
2. Выражение (*s++) == *s до инкрементирования. Можно переписать:

while(*s = *c)
{
++s;
++c;
}

++s;
++c;