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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.94
Avazart
 Аватар для Avazart
7037 / 5214 / 259
Регистрация: 10.12.2010
Сообщений: 22,918
Записей в блоге: 17
#1

const volatile - C++

13.08.2012, 03:53. Просмотров 2064. Ответов 29
Метки нет (Все метки)

Пример из Шилдт Г. "С++ Базовый курс (3-е издание, 2010)" стр 205

C++
1
const volatile unsigned char *port = (const volatile char *) 0x2112;
const volatile

Непонятно почему Шилд называет это константным указателем на изменяемый объект.

Как я понимаю volatile здесь не играет ни какой роли в коде... а const относится к переменной, а не к указателю.
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
defer
秘密
 Аватар для defer
555 / 235 / 3
Регистрация: 29.11.2010
Сообщений: 783
13.08.2012, 04:32     const volatile #2
Вы книгу на английском найдите, тогда и видно будет, что имел ввиду автор
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
13.08.2012, 07:31     const volatile #3
Avazart, volatile вполне актуально. const относится к данным.
C++
1
2
3
4
5
6
7
8
9
10
int main()
{
    const volatile int *x;
    volatile const int y = 6, *z = &y;
    x = &y;
    x = z;
    //*x = 7; //error
 
    return 0;
}
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1242 / 991 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
13.08.2012, 07:59     const volatile #4
Всё, что стоит слева от звёздочки, относится к адресуемому объекту. Всё, что справа, — к самой переменной-указателю.

const volatile char *p; именно это и значит: вы не можете изменять значение объекта по адресу p, но вы всегда будете в курсе его изменений другими потоками или чем там ещё, кеши не будут мешать и всё такое, что обычно с volatile. И это не запрещает вам присвоить переменной p другое значение.
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
17192 / 5446 / 337
Регистрация: 30.03.2009
Сообщений: 14,777
Записей в блоге: 26
13.08.2012, 08:51     const volatile #5
[Задача] const volatile

Другими словами, это указатель к read-only данные, которые являются volatile
Avazart
 Аватар для Avazart
7037 / 5214 / 259
Регистрация: 10.12.2010
Сообщений: 22,918
Записей в блоге: 17
13.08.2012, 13:59  [ТС]     const volatile #6
Цитата Сообщение от defer
Вы книгу на английском найдите, тогда и видно будет, что имел ввиду автор
Нашел там тоже самое написано.
Although it seems strange at first thought, it is possible to use const and volatile
together. For example, the following declaration is perfectly valid. It creates a const pointer to a volatile object.
C++
1
const volatile unsigned char *port = (const volatile char *) 0x2112;
In this example, the cast is needed in order to transform the integer literal 0x2112
into a const volatile character pointer.
Цитата Сообщение от alkagolik Посмотреть сообщение
const относится к данным.
Ну и я о том, значит это указатель на константу, а не константный указатель
А
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Всё, что стоит слева от звёздочки, относится к адресуемому объекту.Всё, что справа, — к самой переменной-указателю.
Цитата Сообщение от alkagolik Посмотреть сообщение
volatile вполне актуально.
Почему тогда актуально? Если volatile также стоит до * как и const, а значит играет роль только const
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
17192 / 5446 / 337
Регистрация: 30.03.2009
Сообщений: 14,777
Записей в блоге: 26
13.08.2012, 14:25     const volatile #7
Цитата Сообщение от Avazart Посмотреть сообщение
Ну и я о том, значит это указатель на константу
Я уже писал как-то об этом, что это неверный перевод слова "constant"

В английском языке слово "constant" в первую очередь означает "постоянный", "неизменный". Ну а для русскоязычных людей как-то подсознательно на первый план вылезает "константа" (фиксированная числовая величина)
Другими словами, const-указатель, это НЕ указатель на константу, а указатель, по которому нельзя записывать

кое-что про const
Avazart
 Аватар для Avazart
7037 / 5214 / 259
Регистрация: 10.12.2010
Сообщений: 22,918
Записей в блоге: 17
13.08.2012, 14:27  [ТС]     const volatile #8
Читаю тему...

Цитата Сообщение от Evg Посмотреть сообщение
C++
1
extern volatile const int iii;
Модификатор const с одной стороны говорит о том, что переменная не может изменяться, но с другой стороны модификатор volatile означает, что переменная может изменяться неявным для компилятора образом. Поиском желательно не пользоваться, а попробовать догадаться самому
Цитата Сообщение от Evg Посмотреть сообщение
В конструкции const volatile модификатор const относится только к языковой части, но не к аппаратной. Т.е. переменную const volatile программист не имеет права менять (компилятор будет ругаться), но аппаратура значение переменной может изменить. Т.е. volatile - это переменная, которую можно программно читать и писать (типа порта ввода-вывода), а const volatile - это переменная, которую программно можно только читать (что-то типа таймера)
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1242 / 991 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
13.08.2012, 14:33     const volatile #9
const и volatile — это ортогональные модификаторы. Они не взаимоисключающие или что-то в этом роде.

const — это просьба компилятору давать вам по голове за попытки написать код, изменяющий эту переменную. Конечно, компилятору можно заткнуть рот с помощью const_cast или хитрым жонглированием указателями, но от этого он и не должен спасать.

volatile — это требование генерировать код так, чтобы побочные эффекты, действующие на эту переменную (например, присваивание ей значения; в частности, чтение volatile-переменной тоже считается побочным эффектом), были завершены и видимы в так называемых sequence points (точках следования). Грубо говоря: чтобы перед и после каждого выражения значение volatile-переменной было определено и неизменно, вне зависимости от того, что там компилятор решит надумать оптимизировать и как эту переменную будут дёргать соседние потоки (или ОС). Между выражениями — может «самопроизвольно» изменяться.
Avazart
 Аватар для Avazart
7037 / 5214 / 259
Регистрация: 10.12.2010
Сообщений: 22,918
Записей в блоге: 17
13.08.2012, 14:35  [ТС]     const volatile #10
это НЕ указатель на константу, а указатель, по которому нельзя записывать
Ну так это оно и тоже... покрайней мере... в литературе применяется "указатель на констант" с оговорками что в действительности переменная может не быть константой сама по себе... повышение константности итп...

Ну а константный указатель обычно в литературе это указатель значение которого нельзя изменить ( не обьект)
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1242 / 991 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
13.08.2012, 14:42     const volatile #11
Поэтому лучше не писать какие-то "константные указатели", которые "обычно понимается так, но кое-где эдак", а писать кодом, который имеет один и тот же смысл всегда:
C++
1
2
3
4
5
/* выражение        допустимые операции */
int *s;              // s = 123; *s = 123;
const int *p;        // s = 123;
int * const q;       // *s = 123;
const int * const r; // никаких присваиваний
Avazart
 Аватар для Avazart
7037 / 5214 / 259
Регистрация: 10.12.2010
Сообщений: 22,918
Записей в блоге: 17
13.08.2012, 14:44  [ТС]     const volatile #12
Ну а какую роль volatile играет в объявлении указателя?
Он относится к самому указателю или обьекту?
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
17192 / 5446 / 337
Регистрация: 30.03.2009
Сообщений: 14,777
Записей в блоге: 26
13.08.2012, 14:47     const volatile #13
Цитата Сообщение от Avazart Посмотреть сообщение
Читаю тему...
Первая тема была написана по времени намного раньше, чем вторая. И в тот момент у меня ещё не наступило просветления

Цитата Сообщение от Avazart Посмотреть сообщение
Ну так это оно и тоже...
Нет, не одно и то же. Понятие "указатель на константу" означает, что все чтения по этому указателю выдадут один и тот же результат. Но при наличии volatile это не будет верным (т.е. разные чтения по указателю могут дать разный результат). Т.е. понятие "указатель, по которому нельзя записывать" оно более корректное

Добавлено через 1 минуту
Цитата Сообщение от Avazart Посмотреть сообщение
Ну а какую роль volatile играет в объявлении указателя?
Он относится к самому указателю или обьекту?
Если volatile относится к звёздочке, то относится к памяти, на которую смотрит указатель. Смысл такой, что в коде:

C
volatile int *p;
int x, y;
 
x = *p;
y = *p;
Итоговые значения переменных x и y могут быть различными
Avazart
 Аватар для Avazart
7037 / 5214 / 259
Регистрация: 10.12.2010
Сообщений: 22,918
Записей в блоге: 17
13.08.2012, 14:58  [ТС]     const volatile #14
Ну так они будут стопудово одинаковыми только если p указывает на константу.
C++
1
2
const int a=6;
int *p=&a;
в других случаях с volatile или без они могут отличатся

Или имеется ввиду именно в контексте многопоточности?
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
17192 / 5446 / 337
Регистрация: 30.03.2009
Сообщений: 14,777
Записей в блоге: 26
13.08.2012, 15:03     const volatile #15
Цитата Сообщение от Avazart Посмотреть сообщение
Ну так они будут стопудово одинаковыми только если p указывает на константу.
volatile-объект по определению не может быть константной

Добавлено через 3 минуты
Цитата Сообщение от Avazart Посмотреть сообщение
Ну так они будут стопудово одинаковыми только если p указывает на константу.
Будут. Только всё равно это правильно называть "указатель, по которому нельзя записывать", а не указатель на константу. const-указатель может указывать и не на константу, но в этом случае программист обязан обеспечить, чтобы на время жизни указателя НЕ менялось значение по этому адресу.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
void func1 (int *p)
{
  ....
}
 
void func2 (void)
{
  int x = 5;
 
  func1 (&x);
  x++;
  func2 (&x);
}
в данном примере указатель p (параметр функции func1) НЕ указывает на константу, но за время жизни указателя p значение переменной x (на которую смотрит указатель) не меняется
The_Immortal
1548 / 484 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
13.08.2012, 15:11     const volatile #16
Evg, у меня к Вам вопросик относительно правильных терминов. Как мы уже разобрались, то Шилдтовское "const pointer" - "указатель, по которому нельзя записывать".
К сожалению, не могу встретить в книге случая "константного указателя" или "немодифицируемого указателя" (int *const p) - меня интересует как такое будет звучать на англ?
Avazart
 Аватар для Avazart
7037 / 5214 / 259
Регистрация: 10.12.2010
Сообщений: 22,918
Записей в блоге: 17
13.08.2012, 15:15  [ТС]     const volatile #17
Цитата Сообщение от Evg Посмотреть сообщение
volatile-объект по определению не может быть константной
Ну, а в записи
C++
1
const volatile int x=5;
volatile не играет никакой роли ?
Jupiter
Каратель
Эксперт C++
6548 / 3968 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
13.08.2012, 15:21     const volatile #18
Цитата Сообщение от Avazart Посмотреть сообщение
Ну, а в записи
C++
1
const volatile int x=5;
volatile не играет никакой роли ?
наша песня хороша, начинай сначала

Цитата Сообщение от Evg Посмотреть сообщение
В конструкции const volatile модификатор const относится только к языковой части, но не к аппаратной. Т.е. переменную const volatile программист не имеет права менять (компилятор будет ругаться), но аппаратура значение переменной может изменить. Т.е. volatile - это переменная, которую можно программно читать и писать (типа порта ввода-вывода), а const volatile - это переменная, которую программно можно только читать (что-то типа таймера)
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
const — это просьба компилятору давать вам по голове за попытки написать код, изменяющий эту переменную
Avazart
 Аватар для Avazart
7037 / 5214 / 259
Регистрация: 10.12.2010
Сообщений: 22,918
Записей в блоге: 17
13.08.2012, 15:25  [ТС]     const volatile #19
Т.е.volatile играет роль только придется x кастовать что бы изменить?

И что значит
но аппаратура значение переменной может изменить.
Как ?
- это переменная, которую программно можно только читать (что-то типа таймера)
какой тут может быть пример?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.08.2012, 16:16     const volatile
Еще ссылки по теме:

volatile C++
C++ int const * const foo(const int* param) const - разъясните значение квалификаторов
C++ Const в параметрах. Перед чем нужно употребить const дабы обезопасить данные от изменения
Ошибка: Cannot convert 'char const[18]' to 'const wchar_t *' C++
C++ Модификатор const для параметра функции не const?

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

Или воспользуйтесь поиском по форуму:
The_Immortal
1548 / 484 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
13.08.2012, 16:16     const volatile #20
Цитата Сообщение от The_Immortal Посмотреть сообщение
Evg, у меня к Вам вопросик относительно правильных терминов. Как мы уже разобрались, то Шилдтовское "const pointer" - "указатель, по которому нельзя записывать".
К сожалению, не могу встретить в книге случая "константного указателя" или "немодифицируемого указателя" (int *const p) - меня интересует как такое будет звучать на англ?
В общем-то, возможно, что у всех по-разному

Вот к примеру книжка Стивена Дьюхерста "C++. Священные знания" (Stephen C. Dewhurst "C++ Common Knowledge"):
Тема 8. Константные указатели и указатели на константу
Item 8. Const Pointers and Pointers to Const
У Шилдта же под "const pointer" подразумевается "pointer to const" (по Дьюхерсту), что не очень-то логично Так что если придерживаться оригинальной терминологии, то, например, у Дьюхерста данные термины введены корректнее, нежели у Шилдта (а точнее термин "const pointer").

Ну а касательно "pointer to const" - "указатель на константу" (также по Дьюхерсту). Такой перевод имеет место быть (и мне кажется много где), поэтому Avazart и употреблял "указатель на константу". На самом деле звучит не очень правильно, но я думаю, что большинству должно быть интуитивно понятно, что здесь подразумевается "указатель, по которому нельзя записывать"
Yandex
Объявления
13.08.2012, 16:16     const volatile
Ответ Создать тему
Опции темы

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