Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
Olejeg85
13 / 10 / 0
Регистрация: 27.03.2011
Сообщений: 164
#1

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

19.06.2011, 15:31. Просмотров 1407. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.06.2011, 15:31
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Различия между двумя циклами (C++):

Степень всеми циклами и двумя рекурсиями - C++
#include &lt;iostream.h&gt; double degree1(double A, signed int n); double degree1(double A, unsigned int n); double degree2(double A,...

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

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

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

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

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

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

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

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

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

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

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

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

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

arr = это указатель на "qwerty"
а вот *arr - это указатель на первый элемент.
но если *parr=arr; присвается не "qwerty", а указатель на первый элемент...
0
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
19.06.2011, 16:15 #10
Присваивается также указатель на "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
915 / 740 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
19.06.2011, 16:33 #11
Если сравнивать указатель в цикле то нужен последний адрес-элемента массива или буфера, чтобы завершить цикл до идентичности адресов памяти, такой приём в основном применяют для
написания кросс-процессорных алгоритмов типа 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
Olejeg85
13 / 10 / 0
Регистрация: 27.03.2011
Сообщений: 164
19.06.2011, 16:38  [ТС] #12
вот два способа написания
C++
1
2
3
    char arr[]="hello, world";
//или
char *ptr="hello, world";
я разницы между ними особой не вижу, что в первом случае, что во втором, действия можно над ними в обоих случаях проводить одинаковые

вообще разница в использовании есть? или тут уже кому как больше нравится?
0
grizlik78
Эксперт С++
1913 / 1445 / 113
Регистрация: 29.05.2011
Сообщений: 3,001
19.06.2011, 19:42 #13
Цитата Сообщение от 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
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
20.06.2011, 08:57 #14
Цитата Сообщение от 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
tylix
68 / 55 / 6
Регистрация: 10.06.2011
Сообщений: 149
20.06.2011, 12:08 #15
Цитата Сообщение от accept Посмотреть сообщение
зачем использовать strlen(), если она точно так же реагирует на нуль-символ в конце
Это вопрос??

Не по теме:

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



ПС accept сорри, я так понял ты это и хотел кому-то показать )
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.06.2011, 12:08
Привет! Вот еще темы с ответами:

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

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

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

Различия между scanf("%s") и gets() - C++
На сколько я знаю, scanf(&quot;%s&quot;) считывает до первого пробела, а gets() до первого переноса строки. Недавно заметил такую вещь: gets(),...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
20.06.2011, 12:08
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru