Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
4 / 4 / 0
Регистрация: 12.05.2015
Сообщений: 38

Непонятно функционирование цикла while в данном примере

12.05.2015, 09:13. Показов 1236. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет, ребят! Заранее благодарю за помощь.
Пример взят из книги Шилдт C++ "Шаг за шагом" и немного модифицирован мной, для выведения промежуточных результатов адресов и значений.
Глава: "Передача массива в функцию"

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>
 
 
using namespace std;
void cube(int *n, int num);  //*n - начало массива, num - кол-во переменных в массиве
 
int main()
{
    setlocale(LC_ALL, "Russian");
    int nums[10], i;
    
 
    for (i = 0; i < 10; i++)     //Цикл заполнения массива
        nums[i] = i + 1;
    cout << "Изначальные значения: \n";
    for (i = 0; i < 10; i++)     //Цикл вывода начальных значений заполненного массива
        cout << nums[i] << " " << &nums[i] << "\n";
    
    cube(nums, 10);               //Возведение значений в куб
    cout << "Новые значения: \n";    
    for (i = 0; i < 10; i++)      //Вывод новых значений
        cout << nums[i]<<" "<< &nums[i]<<"\n";
    system("Pause");
    return 0;
}
 
void cube(int *n, int num)
{
    while (num)
    {
        *n = *n * *n * *n;
        num--;
        n++;
    }
 
}
Из этого всего непонятен цикл while в функции cube
C++
1
2
3
4
5
6
7
8
void cube(int *n, int num)
{
    while (num)
    {
        *n = *n * *n * *n;
        num--;
        n++; //Почему здесь к n не прибавляется выражение выше? пробовал подставлять *n, все равно программа выдает корректные результаты, то есть возводит в куб.
    }
По моей логике это должно работать так

while(9)
{
*n= 2*2*2
9-1
8+1
Повтор цикла
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.05.2015, 09:13
Ответы с готовыми решениями:

Найти ошибку в данном примере
#include &lt;math.h&gt; #include &lt;iostream&gt; using namespace std; int main() { int n, a; cin &gt;&gt; n; int sum = 1/a; for (int...

Почему ответ равен 0 в данном примере: 3/4*6!?
Почему ответ равен 0 в данном примере: 3/4*6!?

Объясните, как в данном примере работает friend
friend bool operator== (const String&amp; firstStr, const String&amp; secondStr); Если писать код без friend, то возникает ошибка: ...

7
196 / 197 / 120
Регистрация: 27.05.2011
Сообщений: 545
12.05.2015, 09:29
Лучший ответ Сообщение было отмечено ultradox как решение

Решение

У разыменовывания (*) приоретет ниже, чем у постфиксного инкремента (++), поэтому код `*n++` равносилен `*(n++)`.
`n++` — переход к следующему элементу массива, т.е. сдвиг указателя на один элемент вправо. (Дело в том, что функция cube работает лишь с указателем).
1
4 / 4 / 0
Регистрация: 12.05.2015
Сообщений: 38
12.05.2015, 10:20  [ТС]
Спасибо за быстрый и внятный ответ!
Более менее все понял. Но пока еще не чувствую твердой почвы с указателями, вроде два символа *-вывести значение, расположенное по адресу памяти, &-вывести адрес значения, а везде работают по-разному.

А еще вопрос опять же с этим же циклом:
C++
1
2
3
4
5
6
7
8
void cube(int *n, int num)
{
    while (num)
    {
        *n = *n * *n * *n;
        num--;
        (*n)++//изменил вот эту строку
    }
Поставил скобки у инкримента n и по идее должно быть так, показываю второй цикл, программы для наглядности:
*n= 2*2*2 ==8
(*8)++
но на практике работает как-то по-другому. Скриншот не могу вставить.
Скопирую строку:
Новые значения:
1267535401 002DFE3C
2 002DFE40
3 002DFE44
4 002DFE48
5 002DFE4C
6 002DFE50
7 002DFE54
8 002DFE58
9 002DFE5C
10 002DFE60
Для продолжения нажмите любую клавишу . . .
Спасибо!
0
5 / 5 / 4
Регистрация: 31.03.2015
Сообщений: 48
12.05.2015, 10:38
n это указатель на массив int. Применение операции инкремента к нему вызовет переход указателя на следующий элемент. В первой строке цикла присваивается куб. Во второй выполняется декремент num(размер массива). В третьей перевод указателя на следующий элемент. n это адрес элемента, а не число! а num это просто размер массива, можешь хоть к нулю его приравнять, элементы массива не изменятся, потому, что это просто значение которое передает функции размер массива.
1
196 / 197 / 120
Регистрация: 27.05.2011
Сообщений: 545
12.05.2015, 11:56
Оператор * в С++ имеет два разных смысла. То, как этот символ интерпретируется, зависит от того, является ли он бинарным либо унарным.
Если он бинарный, т.е. справа и слева от него есть какие-то операнды, то это просто умножение.
Если же, он унарный, т.е. у него лишь один операнд, то это операция разыменовывания. В результате получается именующее выражение, т.е. оно может стоят в левой части оператора присваивания (=). И ещё кое-какие отличия.
Так, например, в строчке `*n = *n * *n * *n` звёздочка используется в обоих этих смыслах. Первая и вторая слева звёздочки — операция разыменовывания. Третья и пятая — умножение, четвёртая и шестая — опять же разыменовывание. Пробелы никакой роли не играют.

Символ & также имеет два смысла.
В первом случае он интерпретируется как унарный оператор взятия адреса. Возвращает значащее выражение, т.е. ему нельзя ничего присваивать, оно является значением.
Напримаер:
C++
1
2
int a;
&a;   // адрес a
Во втором случае амперсанд выступает в роли модификатора типа. Если & приписать после названия типа, то получится ссылочный объект.
Например:
C++
1
2
3
4
5
int a = 42;
int& b = a;   // ссылка на a, т.о. объект a имеет два имени: a и b
int &c = a, d = a;   // c — ссылка на a, но d — переменная со значением 42
// здесь создан объект a, который также имеет имя b и c
// также создан объект d, который никак не связан с a
Надеюсь, я вас не запутал

Добавлено через 2 минуты
Цитата Сообщение от ultradox Посмотреть сообщение
C++
1
(*n)++//изменил вот эту строку
Вы не передвигаете указатель и num раз работаете с первым элементом массива
1
4 / 4 / 0
Регистрация: 12.05.2015
Сообщений: 38
12.05.2015, 15:45  [ТС]
Благодарю всех за ответы!
Все мне стало ясно теперь.

Хорошего настроения!
0
196 / 197 / 120
Регистрация: 27.05.2011
Сообщений: 545
12.05.2015, 19:13
И всё таки. В дополнение к предыдущему моему сообщению. У звёздочки есть ещё один смысл: модификатор типа.
Сравните:
C++
1
2
int *p, *q;
*p, *q;
Таким образом у звёздочки в С++ имеется целых три смысла.
Ну, всё, теперь хотя бы моя совесть будет спокойна.
1
4 / 4 / 0
Регистрация: 12.05.2015
Сообщений: 38
12.05.2015, 20:38  [ТС]
Как их инициализировать и как использовать в различных выражениях мне неплохо понятно, а вот в моём цикле было не очень, за счёт того, что забыл проверить приоритетность логических выражений. Теперь мне, благодаря вам картина ясна и почему *n в каждом цикле обнуляется и то, что n!=*n. Ещё раз благодарю.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.05.2015, 20:38
Помогаю со студенческими работами здесь

Объясните на данном примере как работать с композицией
Не могу понять как работать с композицией. А именно вывод интересует. Что я делаю не так?#include &lt;iostream&gt; using namespace std; ...

Как изменить значение const в данном примере?
Здравствуйте, я пишу свой интерпретатор. Дело в том, что Parser_impl является константой. Как в нести следующий изменения в данный метод:...

Объясните, как в данном примере работают виртуальные функции?
Такое дело надо обьяснить особенность виртуальной функции, типо как будет работать программа без виртуальных функций #include...

Не могли бы вы объяснить простыми словами что делают функции calloc в данном примере
Не могли бы вы объяснить простыми словами что делают функции calloc в данном примере? struct graph_v//структура вершины графа { ...

Многопоточность. Почему в данном примере один элемент стека будет отброшен, а другой обработан дважды
Почему в данном примере один элемент стека будет отброшен, а другой обработан дважды(т.е. каждым потоком)?


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Конвертировать закладки 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. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru