Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
13 / 10 / 1
Регистрация: 27.03.2011
Сообщений: 164

Различия между двумя циклами

19.06.2011, 15:31. Показов 2742. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
объясните различия между двумя следующими циклами while

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
 
using namespace std;
 
int main ()
{
    const char *cp="hello";
    int cnt=0;
 
    while(cp){++cnt; ++cp;}
    while(*cp){++cnt; ++cp;}
 
    system("pause");
    return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.06.2011, 15:31
Ответы с готовыми решениями:

Различия между Java и Си++
Я раньше программировал на си++,сейчас начал на java,нужно понять основные различия 1. Каковы отличия в структуре программы вычисления...

Различия между #define и const
Собственно вопрос: в чем различия и что лучше использовать? Хотелось бы получить развернутый ответ со всеми &quot;pros and cons&quot;.

scanf (какие различия между %f %g %e)
Есть вопрос по функции scanf, а именно про спецификации формата. %f - читает число с плавающей точкой. %g - читает число с плавающей...

20
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
19.06.2011, 15:34
Цитата Сообщение от Olejeg85 Посмотреть сообщение
while(cp){++cnt; ++cp;}
Это же вечный цикл.
Будет работать, пока указатель на что-то указывает(не равен нулю)
Цитата Сообщение от Olejeg85 Посмотреть сообщение
while(*cp){++cnt; ++cp;}
Будет сдвигать указатель и увеличивать cnt, пока указатель не указывает на конец строки. Фактически получится длина строки
0
13 / 10 / 1
Регистрация: 27.03.2011
Сообщений: 164
19.06.2011, 15:48  [ТС]
Цитата Сообщение от diagon Посмотреть сообщение
Это же вечный цикл.
Будет работать, пока указатель на что-то указывает(не равен нулю)

Будет сдвигать указатель и увеличивать cnt, пока указатель не указывает на конец строки. Фактически получится длина строки

а по поводу этого цикла можно подробнее? while(cp){++cnt; ++cp;}
почему он бесконечный получается? если там в конце тоже итератор стоит и по идее как только до конца строки дойдет и встретит 0 то тоже должен перестать работать, единственный отличай я понял что в первом варианте он в условии имеет в качестве значения адрес, а во втором случае имеет ссылку на первый элемент массива или я не правильно понял записи?
0
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
19.06.2011, 15:51
Цитата Сообщение от Olejeg85 Посмотреть сообщение
а по поводу этого цикла можно подробнее? while(cp){++cnt; ++cp;}
почему он бесконечный получается? если там в конце тоже итератор стоит и по идее как только до конца строки дойдет и встретит 0 то тоже должен перестать работать, единственный отличай я понял что в первом варианте он в условии имеет в качестве значения адрес, а во втором случае имеет ссылку на первый элемент массива или я не правильно понял записи?
Потому что даже после выхода за границы массива он будет на что-то указывать, т.е. не будет равен нулю, поэтому условие должно выполнятся всегда. При этом ему без разницы, на что он указывает, т.к. разыменование не используется.
А вот во втором случае используется разыменование, т.е. проверяется не сам указатель, а то, на что он указывает.
И никакого итератора в конце нету...
Хотя бы потому, что итераторы используются в контейнерах=\
1
13 / 10 / 1
Регистрация: 27.03.2011
Сообщений: 164
19.06.2011, 15:55  [ТС]
ну и еще такой вопрос

arr[]; - указатель на первый элемент массива
*parr=arr; - указатель на первый элемент массива

разницы я так понимаю нет?
0
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
19.06.2011, 16:01
Цитата Сообщение от Olejeg85 Посмотреть сообщение
ну и еще такой вопрос

arr[]; - указатель на первый элемент массива
*parr=arr; - указатель на первый элемент массива

разницы я так понимаю нет?
Не понял вопроса...
arr[] это не совсем указатель...
C
1
char arr[]="qwerty";
Это означает, что размер массива компилятор определит сам(в данном случае 7, под слово и нуль-символ)
C
1
arr[0]
Это доступ к нулевому элементу массива, и, если вы имели в виду его, то да, разницы в общем-то нету.
0
13 / 10 / 1
Регистрация: 27.03.2011
Сообщений: 164
19.06.2011, 16:04  [ТС]
из этой строки char arr[]="qwerty"; следует, что arr это тоже указатель на первый элемент массива?
0
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
19.06.2011, 16:08
Опять недопонял...

arr = это указатель на "qwerty"
Если его разыменовать(*arr), то получим первый элемент
0
13 / 10 / 1
Регистрация: 27.03.2011
Сообщений: 164
19.06.2011, 16:11  [ТС]
Цитата Сообщение от diagon Посмотреть сообщение
Опять недопонял...

arr = это указатель на "qwerty"
а вот *arr - это указатель на первый элемент.
но если *parr=arr; присвается не "qwerty", а указатель на первый элемент...
0
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
19.06.2011, 16:15
Присваивается также указатель на "qwerty"
И если разыменовать, то он опять же будет указывать на первый элемент.
C
1
2
3
char * p = a;//указывает на q
++p; //теперь р указывает на w
++p;//теперь на e
Можете проверить
C++
1
2
3
char a[]="qwerty"; 
char * p = a;
cout << p;
0
 Аватар для xAtom
935 / 760 / 299
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
19.06.2011, 16:33
Если сравнивать указатель в цикле то нужен последний адрес-элемента массива или буфера, чтобы завершить цикл до идентичности адресов памяти, такой приём в основном применяют для
написания кросс-процессорных алгоритмов типа STL.

C++
1
2
3
4
5
6
7
8
 const char *cp="hello";
 int cnt=0;
 
const char*  end = cp + strlen(cp);
while( cp != end ) {
       *cp++;
         cnt++;
}
---

в этом случае сравнивается данные из массива или буфера в нашем случае строки заканчиваются '\0' - до его окончания цикл будет завершён.
C++
1
while(*cp){++cnt; ++cp;}
0
13 / 10 / 1
Регистрация: 27.03.2011
Сообщений: 164
19.06.2011, 16:38  [ТС]
вот два способа написания
C++
1
2
3
    char arr[]="hello, world";
//или
char *ptr="hello, world";
я разницы между ними особой не вижу, что в первом случае, что во втором, действия можно над ними в обоих случаях проводить одинаковые

вообще разница в использовании есть? или тут уже кому как больше нравится?
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
19.06.2011, 19:42
Цитата Сообщение от Olejeg85 Посмотреть сообщение
вот два способа написания
C++
1
2
3
    char arr[]="hello, world";
//или
char *ptr="hello, world";
я разницы между ними особой не вижу, что в первом случае, что во втором, действия можно над ними в обоих случаях проводить одинаковые

вообще разница в использовании есть? или тут уже кому как больше нравится?
Разница есть. Даже две разницы
Первое отличие заключается в том, что первая строчка создаёт массив, элементы которого можно менять, а вторая указывает на константную строку, менять которую (в общем случае) недопустимо. Поэтому вторую строку надо бы записывать так:
C++
1
char const *ptr="hello, world";
Второе отличие — между именем массива и указателем на массив. Проявляется оно в уникальном свойстве. Для имени массива верно:
C
1
&arr[0] == (char*)&arr
А для указателя
C
1
&ptr[0] != (char*)&ptr
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
20.06.2011, 08:57
Цитата Сообщение от xAtom
C++
1
const char*  end = cp + strlen(cp);
зачем использовать strlen(), если она точно так же реагирует на нуль-символ в конце

C++
1
2
3
4
5
6
7
8
const char *cp="hello";
 int cnt=0;
 
const char*  end = cp + strlen(cp);
while( cp != end ) {
       *cp++;
         cnt++;
}
C++
1
2
3
4
5
    const char *cp = "hello";
    int cnt = 0;
 
    while (*cp++)
       cnt++;
C++
1
2
    const char *cp = "hello";
    int cnt = strlen(cp);
0
68 / 55 / 11
Регистрация: 10.06.2011
Сообщений: 149
20.06.2011, 12:08
Цитата Сообщение от accept Посмотреть сообщение
зачем использовать strlen(), если она точно так же реагирует на нуль-символ в конце
Это вопрос??

Не по теме:

У меня встречный: Зачем писАть свою функцию strlen(), если такая уже есть?
зачем мне вставлять два цикла вместо
if (strlen(a) > strlen(b)) ?



ПС accept сорри, я так понял ты это и хотел кому-то показать )
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
20.06.2011, 12:57
Цитата Сообщение от Olejeg85 Посмотреть сообщение
если там в конце тоже итератор стоит и по идее как только до конца строки дойдет и встретит 0
Нолю равен символ, а не указаетль на него, условием же продолжения является именно ненулевой указатель.

Добавлено через 3 минуты
Цитата Сообщение от diagon Посмотреть сообщение
arr[] это не совсем указатель...
C++
1
int arr[]={2123,231,23,3423}; //массив, реализуемый через указатель, далее име arr везде будет обозначать константый неразыменованный указатель на переменную
Добавлено через 4 минуты
Цитата Сообщение от Olejeg85 Посмотреть сообщение
arr[]; - указатель на первый элемент массива *parr=arr; - указатель на первый элемент массива разницы я так понимаю нет?
Разницы между копированием укзателя из arr в явный указатель и его непосредственным использованием нет за исключением циклов, перебирающих указатель:
C++
1
2
int arr[]=...;
for(; arr</*Не счем сравниваить*/; ++arr /*Не допустимо, так как указаетль то константный*/)
C++
1
2
3
int arr[n]=...;
int *p;
for(p=arr; p<arr+n; ++p)// А здесь всё в порядке
Добавлено через 5 минут
Цитата Сообщение от diagon Посмотреть сообщение
arr = это указатель на "qwerty" Если его разыменовать(*arr), то получим первый элемент
Вообще то и arr указывает на первый символ, различие между указателем на массив (не путать с указателем на указатель на массвив) и на его нулевой элемент лишь в использовании: по указателю на массив и индексу элмента вычисляется указатель на этот элемент, а указатель на нелевой элмент используется непосредственно для его адресации, но указатель на произвольный элемент вычисляется простым сложением указателя на нулевой элемент с произведением размера и индекса элемента, а использование одного и того же указателя в обеих опостасях не требует даже приведения типа.

Добавлено через 7 минут
Цитата Сообщение от grizlik78 Посмотреть сообщение
&arr[0] == (char*)&arr
&arr имеет тип char ** и имеет значение указателя на arr, (char *)приводит к char*, arrх[0] имеет тип char. Хотя, тест показывает, что равенство истинно, но абсолютно не понятно, с какого перпугу так должно быть.

Добавлено через 6 минут
А вот с точки зрения sizeof статичесткий массив и указатель на его элемент - не одно и то же. Для массива sizeof вёрнёт размер в байтах массива, а для указателя - самого указателя.
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
20.06.2011, 13:12
Цитата Сообщение от taras atavin Посмотреть сообщение
но абсолютно не понятно, с какого перепугу так должно быть.
Ну вот есть такая особенность.

Цитата Сообщение от taras atavin Посмотреть сообщение
А вот с точки зрения sizeof статичесткий массив и указатель на его элемент - не одно и то же. Для массива sizeof вёрнёт размер в байтах массива, а для указателя - самого указателя.
Да, разумеется. Я должен был об этом вспомнить!

Добавлено через 2 минуты
Цитата Сообщение от taras atavin Посмотреть сообщение
&arr имеет тип char **
Не совсем так. &arr имеет тип указателя на массив, который без вопросов автоматически может приводиться к двойному указателю char**
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
20.06.2011, 13:12
Вообще статический массив нифига не указатель, а некая сущность, с которой ассоциированы размер всего массива и указатель на его нулевой элемент.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
21.06.2011, 01:25
Цитата Сообщение от tylix Посмотреть сообщение
Это вопрос??

Не по теме:

У меня встречный: Зачем писАть свою функцию strlen(), если такая уже есть?
зачем мне вставлять два цикла вместо
if (strlen(a) > strlen(b)) ?



ПС accept сорри, я так понял ты это и хотел кому-то показать )
часто бывают задания учебные, где функции стандартной библиотеки пишутся своими руками
исходный код в первом сообщении как раз демонстрирует, что там подсчитывается длина строки
xAtom в сообщении написал избыточный код, а я продемонстрировал, как его можно сократить в контексте исходного задания, и как его можно сократить вообще

не смотри, что там указатель выходит за край, даже за нуль-символ, это можно, устанавливать указатель за последний элемент массива
и даже в таком случае от него можно отнять (cnt + 1), возвратившись к исходной строке, не теряя её
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
21.06.2011, 09:25
Цитата Сообщение от tylix Посмотреть сообщение
Не по теме: У меня встречный: Зачем писАть свою функцию strlen(), если такая уже есть?
А откуда тебе известно, что текущая её версия оптимальна? Иначе же актуальна разработка её новой версии. Новичок врядли сможет сделать лучше, чем стандартные функции уже написаны, но если их доработка актуальна, то кто же будет профессионально этим заниматься. Может это когданибудь будешь ты? Или вдруг тебе потом понадобится не стандратный динамический контейнер, измеряющий, но не хранящий свой размер? Какую нибудь новую корягу изобретёшь с функцией-членом числа узлов? Или строку не стандартную? Или будешь делать числовой тип переменной разрядности и тебе там понадобится функция-член, измеряющая разрядность?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.06.2011, 09:25
Помогаю со студенческими работами здесь

Различия в скоростях между curl и libcurl
Качаю определенный файл через curl curl -O http://myhost.ru/myfile.txt Потом качаю через свою утилиту. #include &lt;stdio.h&gt; ...

Различия между модульным и ООП программированием
Привет, кто может в двух словах обьяснить различия между модульным и ООП программированием? Спасибо.

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

Сравнить две строки на различия не учитывая кол-во пробелов и такие различия в буквах как о-и, н-т, в-д.
Здравствуйте. Помогите пожалуйста дополнить программу. Суть программы - нужно сравнить две строки на различия не учитывая кол-во...

Расстояние между двумя множествами точек - это расстояние между наиболее близко расположенными точками этих
1. Расстояние между двумя множествами точек - это расстояние между наиболее близко расположенными точками этих множеств. Найти расстояние...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru