Всего кода нету. Я так поняла указатель s инкрементируют и приравнивают к указателю с который тоже инкрементируется. И цикл выполняется пока инкрементируемый указатель s приравнивается к инкрементируемому указателю с? Но мне кажется у меня неправильное понимание, так как никто не приравнивает в цикле ничего, а второе даже если бы и приравнивали то цикл был бы бесконечным... Объясните что это значит, пожалуйста.
Доброго дня.
C/C++
Язык С. Что значит данная конструкция? while(*s++=*c++) Заранее спасибо!
Цикл пока значение по указателю s равен значению по указателю c!
Как неравно, так выходим.
Как неравно, так выходим.
Денис Овчинников
А разве оператор сравнения, это не двойное равно?
Строки в С ноль-терминированные. Это значит, что за конец строки принимается код нуля. Выражение условия цикла while возвращает два возможных значения: истина либо ложь. В языке С булевого типа нет, поэтому вычисление значения выражения сравнения неявно приводится к типу int, и если оно равно 0, то возвращается FALSE, что для цикла while означает дальнейшее его прекращение, во всех остальных случаях возвращается TRUE и выполнение цикла продолжается. В вашем случае, в зависимости от задачи, в условии цикла выполняется поиск конца строки либо поиск нуля в массиве путём посимвольного либо поэлементного сравнения их значений путём разыменования указателей. В случае с поиском нулевого элемента в массиве возможен выход за пределы массива. В случае со строкой, код гарантирует, что достигнет конца строки и прекратит дальнейшее выполнение, то есть операторы постфиксного инкремента выполнять уже не будут. Постфиксный инкремент, применяемый к указателям в условии цикла, позволяет сначала присвоить значение по разыменованым указателям, а затем переместить их на очередные символы строки либо ячейки элементов в массиве. Ваш код предназначен для посимвольного копирования одной строки в другую. Но в этом случае буфер под строку, на которую указывает указатель s должен быть не меньше, чем размер копируемой в него строки с учётом 0-терминатора. В данном случае буфер является символьным массивом (статическим либо динамическим), а строка может быть как аналогичными массивами, с обязательным нулём на конце, так и строковым литералом. И ваш код можно переписать следующим способом:
while(*s = *c) {
++s;
++c;
}
Как видите никаких дополнительных инкрементов после выхода из цикла я не пишу, потому что в инструкции while (*s++ = *c++) по достижении 0-терминатора, постфиксный инкремент не выполнится, так как цикл прервётся раньше. Порядок выполнения операций в условии цикла следующий: разыменование указателей, присваивание значения, логическое сравнение, постфиксные инкременты.
while(*s = *c) {
++s;
++c;
}
Как видите никаких дополнительных инкрементов после выхода из цикла я не пишу, потому что в инструкции while (*s++ = *c++) по достижении 0-терминатора, постфиксный инкремент не выполнится, так как цикл прервётся раньше. Порядок выполнения операций в условии цикла следующий: разыменование указателей, присваивание значения, логическое сравнение, постфиксные инкременты.
Денис Овчинников
Спасибо Вам огромное!)
у меня компилятор на ++ выдает ошибку.. а без этого, при достижении 0 выход из цикла
1. Выражение (*s = *c) == *c. И пока (*s = *c) != 0, цикл будет выполняться.
2. Выражение (*s++) == *s до инкрементирования. Можно переписать:
while(*s = *c)
{
++s;
++c;
}
++s;
++c;
2. Выражение (*s++) == *s до инкрементирования. Можно переписать:
while(*s = *c)
{
++s;
++c;
}
++s;
++c;
Похожие вопросы
- Помогите составить код на C++ ,заранее спасибо)
- Срочно!!! Помогите пожалуйста написать код к задачке на с++! Заранее спасибо!
- Написать код на языке с++. Определить позицию начала в строке s слова с номером n. помогите пожалуйста
- C++. Бинарный поиск. Объясните работу данной программы. Найдите такое число x, что , с точностью не менее 6 зн.С while
- Почему создатель Linux Линус Торвальдс называет C++ ужасным языком, а ядро ОС Linux пишется только на Си?
- Чем лучше язык С языка C++?
- C++ Кто то сможет объяснить, почему конструкция switch срабатывает не по плану?
- Циклы C++. Создание программ с циклическими конструкциями.
- Что такое #include <iostream>, std using namespace std В языке программирования C++?
- Объясните максимально простым языком, как работает данный код C++