- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
#include <iostream>
using namespace std;
struct Rooster {
int id = 0;
};
void asshole(const Rooster* roosters) {
Rooster* r = (Rooster*)roosters;
for (int i = 0; i < 3; i++) {
r[i].id = i + 1;
}
}
int main() {
Rooster roosters[3];
asshole(roosters);
for (int i = 0; i < 3; i++) {
printf("%d\n", roosters[i].id);
}
return 0;
}
Rooster 22.11.2019 21:24 # 0
BJlADuMuPCKuu_nemyx 22.11.2019 21:27 # 0
moron 22.11.2019 22:44 # 0
guest8 22.11.2019 22:54 # −999
BJlADuMuPCKuu_nemyx 22.11.2019 23:00 # −1
И вообще, представь, что "asshole" писал не я. Я просто передал в функцию const.
guest8 22.11.2019 23:02 # −999
Rooster 22.11.2019 23:08 # +2
это из разряда #define true false и т.п.
guest8 22.11.2019 23:15 # −999
XYPO3BO3 23.11.2019 01:25 # +1
https://ideone.com/v7XWm0
Всего лишь ворнинг:
guest8 23.11.2019 01:29 # −999
XYPO3BO3 23.11.2019 01:37 # +1
Вот Dummy0001 (правильно написа́л его юзернейм?) любит повсюду писа́ть слово «struct». Вот ему Rooster_tag пригодится.
Перевёл на язык «Dummy0001»:
Ничего не забыл или надо ещё побольше слов «struct» напихать?
guest8 23.11.2019 01:39 # −999
XYPO3BO3 23.11.2019 01:42 # 0
guest8 23.11.2019 01:45 # −999
guest8 23.11.2019 01:51 # −999
Rooster 23.11.2019 07:51 # +1
gost 23.11.2019 11:05 # +1
XYPO3BO3 23.11.2019 11:56 # +2
https://en.cppreference.com/w/cpp/language/consteval
Главное — не перепутать, где использовать «constexpr», а где «consteval»:
Правда, простой и понятный язык?
guest8 23.11.2019 12:04 # −999
XYPO3BO3 23.11.2019 12:10 # +1
У них ещё и constinit есть:
https://en.cppreference.com/w/cpp/language/constinit
Это когда мы хотим убедиться, что начальное значение переменной является константой, чтобы оно попало в бинарник, но дальше мы значение переменной хотим изменять.
guest8 23.11.2019 12:18 # −999
XYPO3BO3 23.11.2019 12:34 # 0
Таким образом, constexpr ещё не гарантирует, что оно всегда будет константой. Это только хинт для компилятора, что тут можно оптимизировать.
consteval же гарантирует, что выражение будет вычисляться на этапе компиляции, поэтому зашкваривает его, и в неконстантном контексте его уже вызвать нельзя.
Если мы зашкварили функцию атрибутом consteval, то для того, чтобы такой же код использовать с переменным аргументом, его придётся продублировать (под другим именем).
constinit же придумали для привередливых, которые хотят убедиться, что начальное значение будет посчитано на этапе компиляции и попадёт в секцию данных.
Ничего не перепутал?
1024-- 23.11.2019 23:45 # 0
Сделали бы уже простую двухпроходную схему.
1. Везде, где нужна константа времени компиляции, выражение заключается в вызов const
2. При компиляции программа запускается, значения внутри const берутся из памяти и сохраняются для вставки в скомпилированную версию
3. Для сложных кобенаций указателей сделать operator char* + constructor (char*) или отдельные операторы сериализации-десериализации (вообще, стандартные они бы пригодились и без этого). Компилятор может соптимизировать десериализатор, если что.
Всё. Не нужно наворачивать говна, сильно усложнять компилятор и стандарт.
XYPO3BO3 23.11.2019 23:50 # 0
https://en.cppreference.com/w/cpp/language/member_functions#const-.2C_volatile-.2C_and_ref-qualified_member_functions
Кстати, что оно там означает?
1024-- 23.11.2019 23:56 # 0
> Кстати, что оно там означает?
Сам себе ответил же:
> this has type const Array*
XYPO3BO3 23.11.2019 23:58 # 0
1024-- 24.11.2019 00:02 # 0
j123123 24.11.2019 00:05 # 0
XYPO3BO3 24.11.2019 00:07 # +1
guest8 24.11.2019 00:42 # −999
XYPO3BO3 24.11.2019 00:46 # 0
gost 24.12.2019 20:59 # +1
А ещё методы можно перегружать по константности:
Хороший пример использования такого подхода — реализация begin()/end() в итераторах. Это очень удобно тем, что не нужно беспокоиться о константности ссылки, «for (auto it = vec.begin();...)» сработает и для «T &», и для «const T &», причём во втором случае it будет константным итератором.
Именно поэтому…
guest8 24.12.2019 21:17 # −999
gost 24.12.2019 21:26 # 0
guest8 24.12.2019 21:28 # −999
gost 24.12.2019 21:29 # 0
guest8 24.12.2019 21:31 # −999
gost 24.12.2019 21:59 # 0
mvngr 15.01.2020 14:38 # 0
guest8 23.11.2019 12:20 # −999
qpjll-oc 24.12.2019 22:15 # 0
AnalBoy 15.01.2020 15:40 # 0
Если пары жидкости растворимы, они осаждаются на слизистых и в дальнейшем проникают в слюну, которая может проглатываться, кроме того, всасывание происходит на всей поверхности пищеварительной трубки, начиная от полости рта и кончая в толстой кишкой.
Именно поэтому работать с химикатами на голодный желудок гораздо опаснее, чем на сытый.
guest8 23.11.2019 17:06 # −999
XYPO3BO3 23.11.2019 17:45 # +1
Чтобы объявить обычный массив (не динамический!), в качестве его размера нужно задать чистую константу.
guest8 23.11.2019 17:48 # −999
XYPO3BO3 23.11.2019 18:00 # 0
Тут roosters[N] будут созданы в стеке тупо декрементом указателя на вершину. На этапе компиляции значение N знать не нужно.
А вот в глобальном контексте в «Plain C» не компилируется.
BJlADuMuPCKuu_nemyx 23.11.2019 18:22 # 0
Это сокращение "Владимир"?
XYPO3BO3 27.12.2019 00:42 # 0
• Внутреннее обозначение аэропорта Владикавказа.
• Великая ложа Англии.
• Very large array = сверхбольшая антенная решётка (радиотелескоп).
guest8 27.12.2019 00:58 # −999
Konardyan 27.12.2019 02:29 # 0
guest8 23.11.2019 18:17 # −999
guest8 23.11.2019 18:18 # −999
XYPO3BO3 23.11.2019 17:50 # 0
Падает во время исполнения, потому что линкер поместил N в секцию .rdata. На платформе же без секции .rdata значение N будет подменено.
Konardyan 27.12.2019 02:30 # 0
guest8 23.11.2019 01:53 # −999
guest8 23.11.2019 01:52 # −999
Rooster 23.11.2019 07:53 # +1
Rooster 23.11.2019 07:49 # 0
guest8 23.11.2019 01:38 # −999
XYPO3BO3 23.11.2019 01:40 # 0
А вот без каста в крестах будет ошибка.
guest8 23.11.2019 01:41 # −999
XYPO3BO3 23.11.2019 01:47 # 0
guest8 23.11.2019 01:50 # −999
XYPO3BO3 23.11.2019 01:59 # +1
guest8 23.11.2019 02:02 # −999
guest8 23.11.2019 02:07 # −999
guest8 23.11.2019 02:12 # −999
guest8 23.11.2019 02:15 # −999
guest8 23.11.2019 02:18 # −999
XYPO3BO3 23.11.2019 02:18 # 0
guest8 23.11.2019 02:19 # −999
guest8 23.11.2019 02:21 # −999
XYPO3BO3 23.11.2019 02:36 # 0
Pack — это собачья стая.
School — это косяк рыб.
Congress — это стая бабуинов.
Pod и flock — это птичья стая.
Float — стая крокодилов.
Safe — утиная стая.
Array — стая ежей.
Host — колония кузнечиков.
Committee — стая мангустов.
Parliament — совиная стая.
Cluster — колония пауков.
guest8 23.11.2019 02:51 # −999
XYPO3BO3 23.11.2019 03:40 # 0
guest8 23.11.2019 03:54 # −999
guest8 23.11.2019 03:21 # −999
guest8 23.11.2019 02:27 # −999
guest8 23.11.2019 02:32 # −999
guest8 23.11.2019 02:35 # −999
guest8 23.11.2019 02:21 # −999
guest8 23.11.2019 02:24 # −999
Rooster 23.11.2019 08:01 # +2
guest8 24.11.2019 00:43 # −999
Rooster 24.11.2019 09:32 # +1
Можешь посмотреть реализацию:
https://github.com/python/cpython/blob/master/Objects/longobject.c
neTyx_npoTKHyTbIu 24.11.2019 14:29 # 0
Видимо это сделано для единнообразности: работать с большими и маленькими числами удобнее одинаково, даже если мы и теряем немного времени на ненужной (с точки зрения байтойоба) операции, ведь мощность указательного типа на современных архитектурах может превышать мощность типа, необходимого для хранения небольших чисел.
Кажется, в Ruby раньше для больших и малых чисел использовались разные типы (с автоматическим превращением, разумеется), но возможно что это уже не так.
XYPO3BO3 24.11.2019 14:34 # 0
ru66oH4uk 24.11.2019 14:42 # +1
Приятнее всего портить что-то в Ruby, там для этого есть все возможности
В Perl так же присутствуют мощные инструменты для портинья
Rooster 24.11.2019 15:56 # 0
А вот с перлом интересно, для чего изначально было придумано overload::constant?
guest8 25.11.2019 03:02 # −999
XYPO3BO3 25.11.2019 01:43 # 0
Юкихиро Мацумото сказал, что они не нужны.
guest8 25.11.2019 01:45 # −999
guest8 25.11.2019 03:01 # −999
Rooster 24.11.2019 16:01 # 0
Desktop 23.11.2019 23:31 # 0
guest8 24.11.2019 00:44 # −999
Desktop 24.11.2019 02:14 # 0
Про объекты в Obj C ты правильно пишешь, но вот остальные типы данных там один в один сишные и ведут себя ЕМНИП как сишные. Думаю, что структуры сишные в Obj C методы тоже можно передавать всеми известными способами, но проверять лень
В этом смысле Свифт другой: там есть чёткое разделение на value и reference прямо на уровне языка. Как по мне, то в прикладухе такая ясная семантика важнее, чем некая условная гибкость
ru66oH4uk 24.11.2019 14:50 # 0
Вероятно, речь тут о том, что в С и С++ программист сам решает, как ему передавать объект: может скопировать, а может передать ссылку или указатель, причем передавать указатель можно даже для объекта на стеке (и разумеется всегда для объекта на куче, так как доступа к нему кроме как через указатель нет).
Речь конечно о ситуации, когда программист имеет контроль и над вызываемой функцией тоже.
ObjCные же объекты всегда располагаются на куче (кроме блоков, кажется, но и те копируются при передаче наружу) и у программиста нету выбора где из создать (и, соответственно, как их передать).
Разделение на value и reference мне нравится.
А можно передать по ссылке value object?
Я спрашиваю, потому что например в C# можно (хотя по умолчанию он конечно скопируется) а например в Java -- нельзя
Desktop 24.11.2019 17:43 # +1
- формально да. Фактически происходит двойное копирование.
https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#ID545
Но, честно говоря, не помню даже, когда бы писал функции с inout
Rooster 23.11.2019 08:02 # 0
guest8 23.11.2019 02:20 # −999
guest8 23.11.2019 02:24 # −999
guest8 23.11.2019 02:26 # −999
Rooster 23.11.2019 07:47 # 0
Именно поэтому я за "-pedantic-errors".
BJlADuMuPCKuu_nemyx 22.11.2019 23:09 # 0
MAKAKA 22.11.2019 23:11 # +1
нууу
эээ
ммм
Это же си, чувак. Тут можно сделать всё, что угодно.
Ты можешь взять число 1234 и скастить его в указатель на массив интов, и что-то там поправить по этому адресу с известными последствиями.
Хочешь, чтоб такое вообще не компилировалось?
gostinho 23.11.2019 01:46 # 0
Rooster 23.11.2019 08:28 # +1
XYPO3BO3 23.11.2019 00:36 # +1
Так точно. Список того, что делают скобочки, очень длинный, и в уме это просчитать трудно, обязательно какой-нибудь из вариантов упустишь из виду. В крестах лучше более явные касты.
gost 01.01.2020 00:58 # 0
*почти
vistefan 01.01.2020 01:05 # +2
gost 01.01.2020 01:18 # +2
vistefan 01.01.2020 01:42 # 0
BJlADuMuPCKuu_nemyx 01.01.2020 00:45 # 0
Имею привычку не использовать «unsigned» при итерации.
Также имею привычку при сравнении «unsigned» и «int» приводить к «int».
guest8 01.01.2020 00:51 # −999
BJlADuMuPCKuu_nemyx 01.01.2020 00:52 # 0
gost 01.01.2020 00:57 # 0
И я за «size_t».
BJlADuMuPCKuu_nemyx 01.01.2020 01:06 # 0
Выкуси.
gost 01.01.2020 01:15 # 0
guest8 22.11.2019 23:00 # −999
BJlADuMuPCKuu_nemyx 22.11.2019 23:05 # 0
guest8 22.11.2019 23:05 # −999
Rooster 22.11.2019 23:06 # 0
guest8 22.11.2019 23:25 # −999
guest8 22.11.2019 23:28 # −999
gostinho 22.11.2019 23:25 # 0
guest8 22.11.2019 23:28 # −999
XYPO3BO3 23.11.2019 00:50 # 0
guest8 23.11.2019 01:42 # −999
Rooster 23.11.2019 08:46 # +2
Это было года 3-4 назад, я только учил асм, сейчас тот код мне кажется глупым. Может быть если использовать байт-код и вынести заголовки отдельно и уместится, но я стал гораздо более ленивее.
Кстати, я тогда не ладил с родителями и мне не разрешали садится за комп, я написал эту системку на смартфоне и собирал и отлаживал её также на смарте в досбоксе )))
XYPO3BO3 23.11.2019 11:50 # 0
bormand 23.11.2019 12:23 # +1
guest8 23.11.2019 12:28 # −999
Rooster 23.11.2019 13:24 # 0
Кстати об ОС и маленьких программах, когда-то на форуме фасма проводилась специальная олимпиада на 512-батную ОС, в посылках были всякие аналоноги досовских дебагеров и тетрисы, а первое место заняла многозадачная Nano OS да ещё и с тремя демо-приложениями для теста.
Тут есть архив с посылками:
http://board.flatassembler.net/topic.php?t=2164&postdays=0&postorder=as c&start=140
Чувствую себя анскилляброй(
XYPO3BO3 23.11.2019 13:29 # 0
Rooster 23.11.2019 13:36 # 0
guest8 23.11.2019 19:34 # −999
XYPO3BO3 23.11.2019 20:55 # +1
XYPO3BO3 24.11.2019 15:12 # +2
https://www.npmjs.com/package/is_number
https://www.npmjs.com/package/@nathanfaucett/is_number
https://www.npmjs.com/package/@jwaterfaucett/is_number
Три пакета, определяющие, является ли аргумент числом.
https://www.npmjs.com/package/is_string
https://www.npmjs.com/package/@indlekofer/is_string
https://www.npmjs.com/package/@jwaterfaucett/is_string
Три пакета, определяющие, является ли аргумент строкой.
https://www.npmjs.com/package/is_boolean
https://www.npmjs.com/package/is_finite
https://www.npmjs.com/package/is_null
https://www.npmjs.com/package/is_object
https://www.npmjs.com/package/is_empty
https://www.npmjs.com/package/is_undefined
https://www.npmjs.com/package/is_nan
Тоже очень нужные пакеты.
guest8 24.11.2019 15:22 # −999
XYPO3BO3 24.11.2019 15:24 # +2
К нему прилагаются юнит-тесты, метаданные пакета, Gruntfile.js, .travis.yml и ещё какая-то поебень.
guest8 24.11.2019 15:38 # −999
XYPO3BO3 24.11.2019 15:44 # +2
guest8 24.11.2019 15:51 # −999
XYPO3BO3 24.11.2019 16:02 # +2
1024-- 24.11.2019 23:42 # 0
NPM работает на пользу Node.js, где есть своя удобная стандартная библиотека https://nodejs.org/api/ с прекрасной документацией.
А большое количество мусорных пакетов говорит юношеском максимализме аудитории, не более того. Понятия модульности и переиспользования возводятся в абсолют.
guest8 24.11.2019 23:49 # −999
1024-- 25.11.2019 00:44 # +1
Хотя, дураки в сообществе - это наоборот хороший знак. Язык достаточно удачен, чтобы на нём смог писать даже идиот.
Это только люди, у которых программирование съело мозг, формируют взгляды на него как на занятие отборной элиты, где не должно быть ни дураков, ни представителей каких-то других профессий, кроме божественных программистов. Но снаружи этого манямирка в реальном мире находятся люди, которым нужна автоматизация их задач, и которым насрать, как там передаётся значение, по ссылке или нет, кто им будет владеть и чем виртуальный метод отличается от невиртуального. Главное - чтобы программа работала, приносила доход и для её обслуживания не надо было нанимать докторов хаскельных наук.
guest8 25.11.2019 01:13 # −999
guest8 25.11.2019 03:13 # −999
guest8 24.11.2019 23:58 # −999
guestinxo 25.11.2019 00:03 # +1
XYPO3BO3 25.11.2019 00:07 # 0
CEMEH 25.11.2019 14:41 # 0
На самом деле JS прост и ебанут.
guest8 23.11.2019 16:56 # −999
guest8 23.11.2019 12:29 # −999
Rooster 23.11.2019 08:31 # 0
BJlADuMuPCKuu_nemyx 22.11.2019 23:06 # 0
https://ideone.com/1jkccD
guest8 22.11.2019 23:07 # −999
gostinho 22.11.2019 23:15 # 0
guest8 22.11.2019 23:20 # −999
Rooster 22.11.2019 23:30 # 0
Кстати, а зачем там статик поставлен? Он же вроде вне фнукций имеет совсем другое значение (петухи будут видны только в этом фале), тут он бессмысленен.
guest8 22.11.2019 23:33 # −999
XYPO3BO3 23.11.2019 00:42 # 0
У формата бинарника a.out, например, нет ридонли-секции. Там только три стандартные секции (код, данные и неинициализированные данные). Линкер может поместить константу либо в код (но тогда не будет защиты от выполнения), либо в данные (но тогда не будет защиты от записи). Обычно выбирают второе.
Тут небольшое расследование о форматах бинарников:
http://govnokod.ru/25359#comment458045
guest8 23.11.2019 01:43 # −999
Rooster 23.11.2019 08:18 # 0
guest8 23.11.2019 16:55 # −999
Rooster 23.11.2019 18:46 # 0
guest8 23.11.2019 18:59 # −999
bormand 23.11.2019 19:08 # 0
guest8 23.11.2019 19:13 # −999
bormand 23.11.2019 19:21 # 0
guest8 23.11.2019 19:33 # −999
bormand 23.11.2019 19:55 # 0
Rooster 23.11.2019 20:18 # 0
Rooster 23.11.2019 20:31 # 0
http://govnokod.ru/25767#comment496654
gost 23.11.2019 11:21 # +2
А вот если объект мутабельный — всё будет окей. Именно поэтому я за «C(++)».
moron 23.11.2019 00:17 # 0
В Паскале модификатор const параметра функции принимает аргумент по ссылке, но запрещает явное изменение значения внутри функции. Да, ссылка — это синтаксический сахар, когда фактически передаётся указатель (без копирования данных), но выглядит, как будто передали данные. Проверяем:
https://ideone.com/SWpK67
Да, работает так же, как в сишке/крестах. Компилятор явно запретил внутри процедуры изменять значение roosters, но не запретил брать адрес и модифицировать косвенно. Какой багор )))
moron 23.11.2019 00:28 # +1
Компилируем, запускаем... Ничего не изменилось. Оказывается, в «Турбо Паскале» тупизированные константы (в отличие от нетупизированных) на самом деле являются инициализированными переменными. Отключаем совместимость с «Турбо Паскалем» директивой {$J-}. Компилируем, запускаем... В «Windows» падает от нарушения защиты, потому что компилятор поместил константу в секцию .rdata, закрытую от записи.
В «Ideone» же защита не сработала: https://ideone.com/pvoMYf
Видимо, та модификация компилятора, которая установлена в «Ideone», ридонли-секцию не создаёт.
guest8 23.11.2019 02:37 # −999
XYPO3BO3 23.11.2019 02:51 # 0
* Чтобы наебать ренджи, нужно компилировать с директивой $R-.
* const:
1. В параметре функции — да, легко наёбывается взятием указателя. Напрямую модифицировать компилятор всё-таки не даёт (уже на этапе компиляции запрещает присвоение).
2. Как типизированная константа — пофиксили во Фрипаскале, если при компиляции отключить совместимость с Турбопаскалем.
XYPO3BO3 23.11.2019 03:54 # 0
https://freepascal.org/docs-html/current/ref/refsu18.html
Для него рантайм проверяет, значение какого типа в данный момент хранится. К сожалению, он может хранить значения только из фиксированного набора типов (скалярные, включая плавающих питухов и перечисления, строки, указатели).
guest8 23.11.2019 03:56 # −999
XYPO3BO3 23.11.2019 04:06 # 0
https://freepascal.org/docs-html/current/ref/refsu20.html
А вот это уже не по-паскалевски, ибо статический анализатор для строчки V:=W.Application.Version; не работает. Это синтаксический сахар: она трансформируется в вызов API, которому передаётся строка 'Application.Version'.
guest8 23.11.2019 17:59 # −999
XYPO3BO3 25.11.2019 01:18 # 0
Оказывается, «Irie Pascal» строго проверяет вариантные записи. Остальные реализации — да, можно наебать.
guest8 23.11.2019 03:00 # −999
XYPO3BO3 23.11.2019 03:08 # 0
А у меня слово «const». Оно отменяет копирование (как «var»), но при этом компилятор включает статический анализатор кода, запрещающий изменение значения.
guest8 23.11.2019 03:19 # −999
XYPO3BO3 23.11.2019 03:26 # 0
guest8 23.11.2019 03:29 # −999
XYPO3BO3 23.11.2019 03:38 # 0
http://www.pascal-central.com/docs/iso7185.pdf
Да, секция, открывающаяся словом const.
Типизированных констант в этом документе не нашёл, как и параметров-констант у функций.
guest8 23.11.2019 03:41 # −999
XYPO3BO3 23.11.2019 03:48 # 0
Так вот реализация в TP имела даже не дыру, а парадные ворота: типизированные константы не были защищены от изменения. По факту это были переменные с начальным значением (они помещались в инициализированную часть секции, физически присутствующую в экзешнике, в отличие от переменных из секции var, которые были в той части, которая физически в экзешнике не присутствовала и создавалась во время загрузки).
Во Фрипаскале это пофиксили: там сделали возможность у var указывать начальное значение, а типизированные константы защитили от изменения. Но при этом добавили переключатель, включающий режим обратной совместимости.
guest8 23.11.2019 03:50 # −999
guest8 23.11.2019 03:52 # −999
XYPO3BO3 23.11.2019 13:36 # 0
В TP, начиная с 4.0, не скомпилируется, потому что слово IMPLEMENTATION зарезервировали для модулей.
XYPO3BO3 23.11.2019 14:17 # 0
Это слово — расширение языка, придуманное «Борландом» в версии 4.0, когда добавили модульную систему.
Что не так?
Rooster 23.11.2019 14:35 # +2
Мне тут говорили, что в стандартном паскале модульцев не было, поэтому прога использующая идентификатор interface работала в стандартном и обсирается в турбированном и его последователях?
Я угандал?
Rooster 23.11.2019 14:36 # 0
XYPO3BO3 23.11.2019 14:48 # 0
По той же самой причине сишный код, содержащий переменные с именем «class», нельзя скомпилировать в «C++».
XYPO3BO3 23.11.2019 03:12 # 0
2. Добавим var — вернёт 20.
3. Добавим const:
Не компилируется:
guest8 23.11.2019 03:18 # −999
XYPO3BO3 23.11.2019 03:29 # 0
Это константный указатель на питуха. Запрещено менять указатель, но не питуха.
guest8 23.11.2019 03:31 # −999
XYPO3BO3 23.11.2019 03:58 # 0
guest8 23.11.2019 04:04 # −999
XYPO3BO3 23.11.2019 04:14 # 0
В Си массив — это сахар над указателем. В Си модно было писать while(*p++ = *q++) и вообще использовать арифметику указателей, где только можно. Поэтому и задумались о защите объектов, на которые ссылаются указатели.
В Паскале же арифметики указателей нет. Можно, конечно, кастовать указатель в число, изменить и кастовать обратно в указатель. Можно использовать инкремент/декремент. Но так обычно не делают. В Паскале модно объявлять типы и делать всё через типы: массивы, записи и т. п. Заодно получим проверку границ индекса массива (которую в Си нужно делать вручную).
Возможно, по этой причине разработчики Паскаля (Вирт и разработчики более поздних реализаций) сразу об указателях на константного питуха не задумались.
guest8 25.11.2019 14:49 # −999
XYPO3BO3 25.11.2019 14:51 # 0
guest8 25.11.2019 14:55 # −999
XYPO3BO3 25.11.2019 15:00 # 0
guest8 23.11.2019 01:25 # −999
guest8 23.11.2019 01:47 # −999
guest8 23.11.2019 01:54 # −999
guest8 23.11.2019 01:59 # −999
XYPO3BO3 23.11.2019 02:05 # 0
guest8 23.11.2019 02:10 # −999
guest8 23.11.2019 02:12 # −999
guest8 23.11.2019 02:16 # −999
XYPO3BO3 25.11.2019 00:13 # 0
guest8 25.11.2019 14:43 # −999
Steve_Brown 25.11.2019 11:19 # +1
(@ перед from нужна как раз чтобы показать, что это идентификатор, т.к. в данном контексте это уже зарезервированное слово)
XYPO3BO3 25.11.2019 13:48 # 0
Говорят, в «PL/1» значков для отделения идентификаторов от ключевых слов не было. Такой код был валиден:
XYPO3BO3 25.11.2019 14:02 # 0
Собачка тут только для того, чтобы передать rvalue в функцию reset.