108 / 108 / 23
Регистрация: 21.03.2010
Сообщений: 445
1

Квалификатор const: пояснить механику работы указанного кода

15.11.2017, 15:19. Показов 1447. Ответов 15
Метки c, const (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
int main(int argc, char *argv[])
{
    const int unchangable = 1;
    std::cout << "unchangable " << unchangable << std::endl;
 
    union Caster {
        const int* const_ptr;
        int* ptr;
    } c;
    c.const_ptr = &unchangable;
 
    std::cout << "unchangable " << unchangable << std::endl << "changable " << *c.ptr << std::endl;
    std::cout << c.const_ptr << ' ' << c.ptr << ' ' << sizeof(c) << ' ' << sizeof(c.const_ptr) << std::endl;
    
    *c.ptr = 0;
 
    std::cout << "unchangable " << unchangable << std::endl << "changable " << *c.ptr << std::endl;
    return 0;
}
Поясните пожалуйста механику работы этого кода. Прежде всего не ясна причина того, что изменения в *c.ptr не изменили unchangable
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.11.2017, 15:19
Ответы с готовыми решениями:

Квалификатор const
Квалификатор const часто используется для того, чтобы предотвратить изменение функцией объекта, на...

Квалификатор const (или же enum)
Приветствую, саморитяне! Собственно, зачем нужны константы в С++? Нельзя ли просто не менять...

Каким образом реализуется квалификатор const?
Каким образом реализуется квалификатор const? Хранится ли в памяти в процессе выполнения программы...

Пояснить результат работы кода
Добрый вечер. кто нибудь может объяснить в чем здесь подвох? http://rextester.com/BKATS43592 ...

15
119 / 9 / 2
Регистрация: 06.09.2017
Сообщений: 82
15.11.2017, 15:21 2
Лучший ответ Сообщение было отмечено MrGluck как решение

Решение

Цитата Сообщение от CEBEP Посмотреть сообщение
Поясните пожалуйста механику работы этого кода.
UB.

Цитата Сообщение от CEBEP Посмотреть сообщение
Прежде всего не ясна причина того, что изменения в *c.ptr не изменили unchangable
Причина выше.
0
108 / 108 / 23
Регистрация: 21.03.2010
Сообщений: 445
15.11.2017, 15:40  [ТС] 3
это не пояснение а две буквы
0
119 / 9 / 2
Регистрация: 06.09.2017
Сообщений: 82
15.11.2017, 15:55 4
http://eel.is/c++draft/defns.u... ,undefined
0
108 / 108 / 23
Регистрация: 21.03.2010
Сообщений: 445
15.11.2017, 15:57  [ТС] 5
Так, и в какой момент справоцировано непоределённое поведение? я присваиваю указателю значение, я присваиваю значение в валидную область памяти. что не так? где запрещенная операция?
0
322 / 174 / 78
Регистрация: 09.10.2014
Сообщений: 809
15.11.2017, 17:02 6
Компилятор оптимизировал код и подставил unchangable везде, где только смог думая, что она меняться не будет.

Добавлено через 2 минуты
Так делать нельзя.
C++
1
2
3
4
5
const int unchangable = 1;
...
c.const_ptr = &unchangable;
...
 *c.ptr = 0;
0
зомбяк
1582 / 1216 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
15.11.2017, 17:34 7
Цитата Сообщение от CEBEP Посмотреть сообщение
я присваиваю указателю значение, я присваиваю значение в валидную область памяти
Почему в валидную? &unchangable - адрес невалидной области памяти с точки зрения записи в неё. И совершенно не важно, const-указатель содержит его или не-const указатель.
0
108 / 108 / 23
Регистрация: 21.03.2010
Сообщений: 445
15.11.2017, 18:28  [ТС] 8
Цитата Сообщение от lArtl Посмотреть сообщение
Так делать нельзя.
почему нельзя-то? я сделал, всё закомпилировалось.
Цитата Сообщение от TRam_ Посмотреть сообщение
Почему в валидную? &unchangable - адрес невалидной области памяти с точки зрения записи в неё. И совершенно не важно, const-указатель содержит его или не-const указатель.
Логично. То есть я всё-таки изменил данные в памяти, просто за счет невалидности операции в cout попали данные не из unchangable?
0
119 / 9 / 2
Регистрация: 06.09.2017
Сообщений: 82
15.11.2017, 18:40 9
Цитата Сообщение от CEBEP Посмотреть сообщение
всё закомпилировалось.
UB не относится к diagnosable rules, компилятор не обязан сообщать об ошибке.
0
зомбяк
1582 / 1216 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
15.11.2017, 18:46 10
Цитата Сообщение от CEBEP Посмотреть сообщение
То есть я всё-таки изменил данные в памяти
изменил какие-то данные, но где, и что от этого могло сломаться, неизвестно. Именно потому и undefined behavior .

В общем случае это может привести на n-ом запуске к вылету программы, когда операционная система вдруг увидит, что кто-то перезаписал память, которая не должна перезаписываться, во время выполнения этой программы.
0
1369 / 592 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
16.11.2017, 01:00 11
Нет там UB.


Цитата Сообщение от CEBEP Посмотреть сообщение
Прежде всего не ясна причина того, что изменения в *c.ptr не изменили unchangable
Вы и не ссылались *c.ptr на unchangable

А если бы сослались, код бы просто не скомпилировался.
0
Эксперт С++
8737 / 4315 / 960
Регистрация: 15.11.2014
Сообщений: 9,762
16.11.2017, 01:19 12
Цитата Сообщение от daslex Посмотреть сообщение
Нет там UB.
есть.

Цитата Сообщение от daslex Посмотреть сообщение
Вы и не ссылались *c.ptr на unchangable
адрес какой ячейки памяти
по вашему хранился в тот момент в объединении?
1
1369 / 592 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
16.11.2017, 01:31 13
Ясно. Ок. Есть.

Добавлено через 6 минут
Это тоже?
C++
1
2
3
4
5
 union Caster {
        const int a = 200;
        int b;
    } c;
    c.b = 300;
0
438 / 430 / 159
Регистрация: 21.05.2016
Сообщений: 1,338
16.11.2017, 02:15 14
Цитата Сообщение от CEBEP Посмотреть сообщение
Поясните пожалуйста механику работы этого кода. Прежде всего не ясна причина того, что изменения в *c.ptr не изменили unchangable
Потому что c.ptr никак не связян с unchangable
0
зомбяк
1582 / 1216 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
16.11.2017, 02:19 15
Это тоже?
daslex, да. Стандарт предполагает, что в union может одновременно храниться единственное заданное значение. А поскольку присвоить (сохранить) в c.a уже ничего нельзя, то соответственно после c.b = 300; и использовать c.a тоже нельзя. Получается что union Caster в рамках "полностью определённого поведения" оказывается в этом смысле одноразовой.
0
Эксперт С++
8737 / 4315 / 960
Регистрация: 15.11.2014
Сообщений: 9,762
16.11.2017, 02:31 16
Цитата Сообщение от TRam_ Посмотреть сообщение
да. Стандарт предполагает, что в union может одновременно храниться единственное заданное значение. А поскольку присвоить (сохранить) в c.a уже ничего нельзя, то соответственно после c.b = 300; и использовать c.a тоже нельзя.
ответ не верный.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.11.2017, 02:31
Помогаю со студенческими работами здесь

Пояснить результат работы кода
Результатом работы этой программы является:а==0.00, b==2.00 Как я понимаю, данный пример на...

Объяснить алгоритм работы указанного кода
Помогите понять алгоритм этого кода Объясните с комментарием кода или со словами...

Объясните механику работы селектора GroupJoin
Прочел тут https://msdn.microsoft.com/ru-ru/library/bb534297%28v=vs.110%29.aspx и тут...

Пояснить про const в возвращаемом типе функции
когда может понадобится написать такое: const int func(int i) { return i+5; } вопрос...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru