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

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

19.06.2011, 15:31. Показов 2701. Ответов 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
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru