2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2, 3, 4, 5, 6
 
 Re: О константах и перилах
Сообщение28.12.2018, 14:57 
Заслуженный участник


20/08/14
11781
Россия, Москва
upgrade
Если С++ ну совсем непонятен, то пример выше на С будет выглядеть так:
Используется синтаксис C
const int i = 1;
int *p = (int *) (&i);
*p = 2;
Причём как понимаю отдельная переменная p тут не обязательна и добавлена ради простоты понимания, можно и "на лету" тип адреса/указателя сменить.

upgrade в сообщении #1364286 писал(а):
Ничего не понял из этого.
Ну думаю и объяснять ничего не надо. Я то подумал Вы про команды процессора, которые могут читать литерал не только откуда-то из памяти (сегмента данных, ну или кода), но и непосредственно из кода команд, а раз нет, то и говорить не о чем.
Вы лезете в область где плохо разбираетесь и делаете какие-то утверждения ... Зря.

 Профиль  
                  
 
 Re: О константах и перилах
Сообщение28.12.2018, 18:18 


07/08/14
4231
Munin в сообщении #1364289 писал(а):
Правда, результат будет undefined behavior :-)


Код:
const int i = 1;
...
&i

Для си должно выдавать ошибку, у i нет отдельного адреса после компиляции, все равно что написать
Код:
y=&(2+2)
, или пытаться получить адреса каждой двойки и вообще адреса чисел в том числе в выражениях.

Dmitriy40 в сообщении #1364297 писал(а):
можно и "на лету" тип адреса/указателя сменить.
Может в си++ и можно, но вот в си я очень сомневаюсь.

 Профиль  
                  
 
 Re: О константах и перилах
Сообщение28.12.2018, 18:29 
Заслуженный участник


28/04/09
1933
upgrade в сообщении #1364329 писал(а):
Для си должно выдавать ошибку, у i нет отдельного адреса после компиляции
clang 7.0.0 и gcc 8.2.0 с Вами не согласны:
Используется синтаксис C
#include <stdio.h>

const int i = 42;

int main(void)
{
    const int j = 108;
   
    printf("address of i = %p\n", (const void*)&i);
    printf("address of j = %p\n", (const void*)&j);
   
    return 0;
}
 

 Профиль  
                  
 
 Re: О константах и перилах
Сообщение28.12.2018, 18:32 


07/08/14
4231
EtCetera
А что будет если сделать так:
Используется синтаксис C
#include <stdio.h>

const int i = 40+2;

int main(void)
{
    const int j = 100+8;
   
    printf("address of i = %p\n", (const void*)&(40+2));
    printf("address of j = %p\n", (const void*)&(100+8));
   
    return 0;
}
 

 Профиль  
                  
 
 Re: О константах и перилах
Сообщение28.12.2018, 18:33 
Заслуженный участник
Аватара пользователя


16/07/14
9152
Цюрих
upgrade в сообщении #1364329 писал(а):
Для си должно выдавать ошибку
С чего бы? const в C, как и в С++ - это type qualifier ($\S$ 6.7.3). Не нужно путать это с constant как lexical elements ($\S$ 6.4.4) (сильно подозреваю что именно чтобы избежать этой путаницы в С++ переименовали constant в literal).
Address operator & применим в том числе к
C Standard, 6.5.3.2 писал(а):
lvalue that designates an object that is not a bit-field and is not declared with the register storage-class specifier.

 Профиль  
                  
 
 Re: О константах и перилах
Сообщение28.12.2018, 18:35 


07/08/14
4231
Кстати, а зачем используется (const void*)&i, а не просто &i?

 Профиль  
                  
 
 Re: О константах и перилах
Сообщение28.12.2018, 18:36 
Заслуженный участник


20/08/14
11781
Россия, Москва
upgrade
Я снова повторю, Вы говорите лишь об одном весьма частном случае, но обобщаете его на все константы вообще. Это неправильно. Вот Вам работающий пример:
Используется синтаксис C
int a = 1;
const int b = 2;
int main(void)
{
    printf("a:%d\nb:%d\n", &a, &b);
    return 0;
}
Его выхлоп:
Код:
a:6295608
b:4195856
Использовался онлайн компилятор C.

upgrade в сообщении #1364331 писал(а):
А что будет если сделать так:
А так будет ошибка: "error: lvalue required as unary ‘&’ operand".

upgrade в сообщении #1364329 писал(а):
Dmitriy40 в сообщении #1364297 писал(а):
можно и "на лету" тип адреса/указателя сменить.
Может в си++ и можно, но вот в си я очень сомневаюсь.
Можно, можно:
Используется синтаксис C
int main(void)
{
    const int a = 1;
    *(int*)&a = 2;
    printf("%d\n", a);
    return 0;
}
Будет выведено "2".

 Профиль  
                  
 
 Re: О константах и перилах
Сообщение28.12.2018, 18:41 


07/08/14
4231
Вы победили, Вас больше.

 Профиль  
                  
 
 Re: О константах и перилах
Сообщение28.12.2018, 18:53 


10/04/12
705
FomaNeverov в сообщении #1363328 писал(а):
Независимо от языка, так ли необходимы константы, что бы из-за них заморачиваться? Можно просто не менять в программе переменную. А что-бы случайно не забыть, можно назвать, например, const_A.


Ещё в некоторых случаях синтаксис языка допускает в определённом месте только константные выражения. Например, длина массива может быть константой, там нельзя использовать переменные.

Ещё причина — оптимизация. В C операция записи по указателю может изменить почти всё, а const это подсказка, что вот это точно не изменится. Зная значение некоторых констант можно генерировать более эффективный код (заменить умножение на степень двойки сдвигом).

Ну и в C++11 даже возможностей const оказалось мало, там ещё сверху прикрутили constexpr :)

 Профиль  
                  
 
 Re: О константах и перилах
Сообщение28.12.2018, 19:57 
Заслуженный участник


28/04/09
1933
upgrade в сообщении #1364333 писал(а):
Кстати, а зачем используется (const void*)&i, а не просто &i?
Стандарт языка C99 в 8-м абзаце параграфа "7.19.6.1 The fprintf function" писал(а):
The conversion specifiers and their meanings are:
...
p The argument shall be a pointer to void.

 Профиль  
                  
 
 Re: О константах и перилах
Сообщение28.12.2018, 21:01 


14/01/11
3040
Dmitriy40 в сообщении #1364334 писал(а):
Будет выведено "2".

Зависит от архитектуры системы. Может быть выведено и "1" (например, если это значение лежит в EEPROM), может и какой-нибудь memory management fault выскочить.

 Профиль  
                  
 
 Re: О константах и перилах
Сообщение28.12.2018, 21:17 
Заслуженный участник


20/08/14
11781
Россия, Москва
Согласен. Погнавшись за простотой и доступностью примера упустил возможные варианты.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 87 ]  На страницу Пред.  1, 2, 3, 4, 5, 6

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group