Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666

Что значит "изменить" в C++?

23.04.2018, 18:37. Показов 4549. Ответов 76
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В одной из тем было написано
Цитата Сообщение от Croessmah Посмотреть сообщение
Objects of array types cannot be modified
Чтобы не оффтопить там (т.к. там вопрос про устройство массивов) и не мучать тему 2014-го года, создам новую.
Как понимать сие утверждение?
Возьмём код
C++
1
2
int a[2] = { 0, 2, };
a[1] = 1;
По-моему, массив a после a[1] = 1 изменился.
Получается, "Objects of array types cannot be modified" — неправда? Или всё же массив a не изменился?
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.04.2018, 18:37
Ответы с готовыми решениями:

Sleep(8000) - что значит? На что можно заменить в борланд с++?
Не распознаёт Sleep(8000) . Если за комментировать пишет что f заданно но не используется. Как исправить? ...

Что значит Handle hf? Что в эту функцию нужно передавать
мне нужно создать функцию Node * ReadNode(HANDLE hf); (Node это структура) Так вот вопрос в том что значит Handle hf? Что в эту функцию...

Неправильный тип параметров подпрограммы-- что это значит и как изменить?
Выдает ошибку:" Неправильный тип параметров подпрограммы" - как это исправить? Разработать модуль, в котором размещены подпрограммы,...

76
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
23.04.2018, 21:13
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от rat0r Посмотреть сообщение
Объект s здесь не изменился?
Объект s изменился, потому что вся структура является объектом, в том числе ее член i.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
23.04.2018, 21:13
Цитата Сообщение от rat0r Посмотреть сообщение
То есть, не только массивы неизменны, но и любые другие объекты, даже скалярного типа, неизменны?
В том смысле, что и массивы. Смысла тут не много. Объект создаётся с неизменным адресом и размером. Из этого сделали открытие. Хотя, когда говорят о decay - автоприведении массива к указателю, то имеет смысл помнить о том, что это константный указатель. То есть, если:
C++
1
int a[10];
то
C++
1
а++
не прокатит. Хотя легко:
C++
1
2
int * b = a;
b++;
И всё.
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
23.04.2018, 21:20  [ТС]
Цитата Сообщение от QuakerRUS Посмотреть сообщение
Объект s изменился, потому что вся структура является объектом, в том числе ее член i.
Ну и весь массив является объектом, в том числе его элементы.

Цитата Сообщение от IGPIGP Посмотреть сообщение
имеет смысл помнить о том, что это константный указатель
Имеется в виду это правило:
Цитата Сообщение от http://eel.is/c++draft/conv.array
An lvalue or rvalue of type “array of N T” or “array of unknown bound of T” can be converted to a prvalue of type “pointer to T”. The temporary materialization conversion is applied. The result is a pointer to the first element of the array.
?
Был массив int[10] (array of N=10 of T=int), по этому правилу он превращается в указатель типа int* (pointer to T=int). Тут нет константности.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
23.04.2018, 21:25
Цитата Сообщение от rat0r Посмотреть сообщение
Ну и весь массив является объектом, в том числе его элементы.
А кто сказал что нет? Я говорил:
Цитата Сообщение от IGPIGP Посмотреть сообщение
Объект создаётся с неизменным адресом и размером.
Цитата Сообщение от rat0r Посмотреть сообщение
Был массив int[10] (array of N=10 of T=int), по этому правилу он превращается в указатель
Нет. Ни кто не в кого не превращается. Есть неявное приведение типа. Если указателю присваивается массив, то указатель может быть не констаннтным. Это вообще, о другом.
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
23.04.2018, 21:29  [ТС]
Цитата Сообщение от IGPIGP Посмотреть сообщение
А кто сказал что нет?
Это был ответ QuakerRUS.

Цитата Сообщение от IGPIGP Посмотреть сообщение
Нет. Ни кто не в кого не превращается. Есть неявное приведение типа.
Под "превращается" это именно и понималось. Что приводится в определённых контекстах.

Я говорил о
Цитата Сообщение от IGPIGP Посмотреть сообщение
когда говорят о decay - автоприведении массива к указателю, то имеет смысл помнить о том, что это константный указатель.
и показал, что по правилу о decay (array-to-pointer conversion в стандарте) получается указатель, который не является константным.
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
23.04.2018, 21:32
rat0r, с чего вы решили, что совокупность элементов массива входят в объект массива? Когда вы в функцию, например, передаете массив, что происходит? А когда структуру передаете, что происходит?
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
23.04.2018, 21:39  [ТС]
Цитата Сообщение от QuakerRUS Посмотреть сообщение
с чего вы решили, что совокупность элементов массива входят в объект массива?
Цитата Сообщение от http://eel.is/c++draft/intro.object#2
Objects can contain other objects, called subobjects. A subobject can be a member subobject ([class.mem]), a base class subobject ([class.derived]), or an array element.
Цитата Сообщение от QuakerRUS Посмотреть сообщение
Когда вы в функцию, например, передаете массив, что происходит? А когда структуру передаете, что происходит?
А это вообще при чём?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
23.04.2018, 21:47
Цитата Сообщение от rat0r Посмотреть сообщение
Это был ответ QuakerRUS.
Понятно.
Цитата Сообщение от QuakerRUS Посмотреть сообщение
rat0r, с чего вы решили, что совокупность элементов массива входят в объект массива?
А совокупность полей класса или структуры тоже не входят в объект структуры? Понимание объекта в которое не входит объект принадлежащий объекту, не в ходит не в какие ворота.(imho)
Цитата Сообщение от rat0r Посмотреть сообщение
получается указатель, который не является константным.
А кто сказал иное. Приведение массива к указателю, это прежде всего временный объект рождённый по месту использования имени. А потом при присваивании получается копия. А вот если вы инкрементируете само имя, то это нечто иное. Там, где я это написал (это не мной придумано и давно известно), всё это сказано просто и по-русски. Посмотрите ещё раз:
https://www.cyberforum.ru/cpp-... st12333993
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
23.04.2018, 21:56  [ТС]
Цитата Сообщение от IGPIGP Посмотреть сообщение
Цитата Сообщение от rat0r Посмотреть сообщение
получается указатель, который не является константным
А кто сказал иное
Вот:
Цитата Сообщение от IGPIGP Посмотреть сообщение
когда говорят о decay - автоприведении массива к указателю, то имеет смысл помнить о том, что это константный указатель.
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
23.04.2018, 22:06
Хорошо, я был неправ.

An object of array type contains a contiguously allocated non-empty set of N subobjects of type T.
2
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
23.04.2018, 22:07
Цитата Сообщение от rat0r Посмотреть сообщение
Вот:
rat0r, читайте. Приведение массива к указателю даёт константный указатель. Но когда вы используете "термины" - превращается/получается, то вы же их и критикуйте. Есть элементарные вещи которые говорят о том что константа может быть присвоена не константе но не наооборот. В этом смысле, строго говоря константный указатель приводится к неконстантному:
C++
1
2
3
4
5
int a(123), b(456);
int * const pa = &a; 
pa = &b;//а после инициализации - нельзя уже
//хотя так - сколько угодно
int * pb = pa;
а поменять местами относительно знака равенства константу и неконстанту нельзя.
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
23.04.2018, 22:18  [ТС]
Цитата Сообщение от IGPIGP Посмотреть сообщение
Приведение массива к указателю даёт константный указатель.
Какое приведение? array-to-pointer conversion которое?
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
23.04.2018, 22:22
Цитата Сообщение от rat0r Посмотреть сообщение
Objects of array types cannot be modified
Судя по тому, что после этого утверждения ведет ссылка в раздел "6.10 Lvalues and rvalues", думаю речь именно о попытке модифицировать сам массив, а не его элементов через индекс.
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
23.04.2018, 22:24  [ТС]
Цитата Сообщение от QuakerRUS Посмотреть сообщение
Судя по тому, что после этого утверждения ведет ссылка в раздел "6.10 Lvalues and rvalues"
А что в том разделе запрещает модифицировать массив?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
23.04.2018, 22:30
Цитата Сообщение от rat0r Посмотреть сообщение
Какое приведение? array-to-pointer conversion которое?
издеваетесь?
http://en.cppreference.com/w/c... nter_decay
Цитата Сообщение от cppreference
There is an implicit conversion from lvalues and rvalues of array type to rvalues of pointer type
Цитата Сообщение от QuakerRUS Посмотреть сообщение
речь именно о попытке модифицировать сам массив
Что значит, - сам массив? В этом смысле саму переменную:
C++
1
int a;
нельзя модифицировать. Только значение в ней можно модифицировать. Но и значения в массиве можно модифицировать. Тут, мне кажется, попытка спутать тип и значение. Хотя такие вещи можно вычитать в книгах и даже в стандарте. Математики - забавные люди. Это я как инженер и физик говорю.
1
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
23.04.2018, 22:37  [ТС]
Цитата Сообщение от IGPIGP Посмотреть сообщение
Нет. Я показал уже цитату из стандарта. Там не получается константного указателя.

И ещё:
C++
1
2
3
4
int a[10];
a++;
^ здесь не должно быть array-to-pointer decay,
инкремент не позволен не потому, что тут какой-то "константный указатель"
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
23.04.2018, 22:37
Цитата Сообщение от IGPIGP Посмотреть сообщение
Что значит сам массив
То есть я имею ввиду попытку модифицировать объект массива обратившись к массиву по имени, а не через индекс. То есть фраза вполне логична. Про индекс далее говорится отдельно.

[ Note: Conversions affecting expressions of array type are described in 7.2. Objects of array types cannot be
modified, see 6.10.
—end note ]
6 [ Note: Except where it has been declared for a class (16.5.5), the subscript operator [] is interpreted in
such a way that E1[E2] is identical to *((E1)+(E2)) (8.2.1). Because of the conversion rules that apply to
+, if E1 is an array and E2 an integer, then E1[E2] refers to the E2-th member of E1. Therefore, despite its
asymmetric appearance, subscripting is a commutative operation.
—end note ]
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
23.04.2018, 22:41  [ТС]
QuakerRUS, ок. Тогда что делать с https://www.cyberforum.ru/cpp-... st12333959 ?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
23.04.2018, 22:44
Цитата Сообщение от QuakerRUS Посмотреть сообщение
То есть я имею ввиду попытку модифицировать объект массива обратившись к массиву по имени, а не через индекс. То есть фраза вполне логична. Про индекс далее говорится отдельно.
Массив это объект сложный. Любую структуру у которой нет оператора присваивания можно модифицировать лишь косвенным обращением к полям. Это оператор - точка, например. Или стрелка если по указателю. Создайте структуру из n элементов типа T и семантически (а если повезёт то и внутренне) она не будет отличаться от массива T[n]. Далее останется перегрузить ей оператор индексного обращения и сходство будет просто разительным. А потом глядя на то, что говорится о массивах, будет справедливо сказать, что и структуру такого вида нельзя изменить. И в каком-то смысле это тоже правда. Как бы ни смешно это выглядело.
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
23.04.2018, 22:52
rat0r, так литералы и массивы разные вещи. Я выше писал про использование литералов компилятором. Один и тот же литерал может использоваться в разных частях программы. Если его изменить, то в другой части программы будет неопределенное поведение. Литералы разные могут быть. Это числа 0, 1, строковые литералы.

Вот вы например пишете такой код.

C++
1
2
3
4
5
6
7
8
9
10
11
12
void foo()
{
    cout << 1 << endl;
}
 
int foo2()
{
    int a = 0;
    a += 1;
    
    return a;
}
Поменяйте литерал 1, и изменится логика работы обоих функций.

Добавлено через 2 минуты
IGPIGP, верно. Вопрос был по фразе.

Objects of array types cannot be modified
Я пытаюсь понять и трактовать, что имели ввиду те, кто ее написал. О чем и спрашивал ТС в первом посте темы.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.04.2018, 22:52

Что значит public string T и все что дальше в приведенном коде?
class String { private string A; public String() { } public string T { ...

6 cores are activated что это значит и что с этим делать?
Доброго времени суток уважаемые форумчане. Возникла вот такая незадача с компом. Пишет 6 cores are activated при загрузке (в том же меню...

Написать что значит каждая строчка и за что она отвечает
Program ABC const n = 5; var a: array of integer; i, S, p: integer; begin s := 0; p := 1; for i := 1 to n do

Что значит исследовать сходимость метода (Якоби) и что за график нужно построить
Здравствуйте, вопрос в следуещем. В лабе по ЧМ нужно решить СЛАУ методом Якоби(что я сделал) и исследовать сходимость метода, построить...

Что значит это условие? Немогу расчехлить на что тут идёт проверка!!!
НЕмогу понять на что идет проверка. if monthof(DateTimePicker1.date+33)&lt;9 then radiobutton3.Checked:=true else ...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru