2014 dxdy logo

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

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




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


20/08/14
11966
Россия, Москва
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
9416
Цюрих
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
11966
Россия, Москва
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
706
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
3125
Dmitriy40 в сообщении #1364334 писал(а):
Будет выведено "2".

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

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


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

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

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



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

Сейчас этот форум просматривают: Dmitriy40


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

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