Pull to refresh

Comments 27

Переменная по определеннию это поименованная область памяти. При этом константа это частный случай переменной.
И плюс выражение lines[i] есть по сути именнованный указатель на область памяти в чистом виде. Т.е. являеться переменной.

Вам либо нужно дать свое определение переменной отличной от классического, либо в вашей программе используються переменные.
Конастанта — это переменная) Звучит. С учетом того, что константы могут заменятся на свои значения еще на этапе компиляции, звучит особенно)
Именно переменная. Если вы пишите const int bla = 1; то значение bla может поменять легко и не принужденно. Это вы можете сделять явно сами, или это может произойти не явно.

Еще раз, переменная это поименнованная область памяти. Это классическое определение.
const int a; чем под это определение не подходит?

Если рассматривать константы в ключе си, то конечно да, это является частичным случаем переменных. Но вообще это не всегда так.
А в данном случае вообще надо было бы объявить все константные значения через дефайн и вопросы бы отпали)
А по поводу раскрытия на этапе комплиции — цикл при компиляции может быть легко раскрыт в switch, но от этого он циклом являеться по сути не перестанет.
Интересно, а как вот эту строку const int AB[2] = {delete_duplicate(lines, a, 0), delete_duplicate(lines, a, 1)}; вам компилятор заменит?
Пусть меня поправят, но на сколько я знаю, в С языках константа это переменная без set, значение которой устанавливается на моменте выделения памяти.
В случае чистого С — несомненно.
Насчет С++ не уверен. Я же правильно понимаю, в следующем коде (компилировал g++4.4):
int main() {
const int NUM = 10;
int array[NUM];
}
NUM — константа времени компиляции? Или у того, что компилятор не бьет по пальцам за неконстанту в объявлении массива, есть другая причина?
По пальцам бьёт от того, что при входе в блок кода (тут функции) все переменные должны быть выделены в стеке вызова (если не ошабаюсь) перед исполнением кода. Именно по этому там должна быть именно константа, и в данном случае, она будет времени компиляции (ака define). Но вообще, в теории, это должна быть ячейка в памяти. (хотя тут как компилятор решит)
Переменная — что-то изменяемое, о чём нам намекает название. Константы я не отношу к переменным по той причине, что если они были созданы, то они уже не могут быть изменены. (хотя и знаю как они представлены в памяти)

lines — константа указывающая на массив. А та ячейка памяти, на которую указывает lines[2] к примеру это переменная? Она ведь никак не именована. Если да, то каждый байт памяти — переменная, ибо его можно адресовать. (технически конечно)
Ок, что-то изменяемое. Если я опишу переменную как const int a = 1; я легко могу поменять значение переменной а. Многими способами.

Что про название — это калька с variable, это слово в программирование пришло как я считаю из математики в котором корректный перевод будет величина. Но прижилось переменная. Ладно, пойдем с другой стороны.

Дайте определение переменной?
Переменная — некоторый объект с изменяемым состоянием, отображённый в память.

Понятие переменная в программирование и в математике очень разнятся. В математике переменная определяется только один раз в одном контексте, отражение чего мы можем наблюдать во многих функциональных языках.

То что константу в си можно изменить, это недостаток самого языка. Если кто-то снимает может снять штаны через голову, то это не говорит нам о том, что это свитер.
variable — «изменяемая» (величина)
value — «величина»

Преимущества stateless-программирования (без состояний — в том числе без переменных) давно и качественно рассматриваются в функциональном программировании.
Мне как раз не понравился пример «без состояний» на примере «без переменных»
stateless — это когда результат работы объекта не зависит от какого-либо контекста или внутреннего состояния. Пытаться этого добиться такого результат отказавшись от использования переменных видиться мне как если бы для того чтобы научиться ходить на рукам мы бы себе отрезали ноги.
=)
по своему так и есть — чтобы гарантированно убрать состояния в программе, себя ограничили правилом «не использовать переменные, а только константы». Естественно, далеко не все переменные отвечают за состояние, но ведь тут вопрос гарантии. Пролог, вон, тоже ограничен хорновскими дизъюнктами и логикой первого порядка, из-за чего приходится наизнанку выворачиваться, когда нужно сложные вещи на нем сформулировать. Зато гарантированно разрешим за конечное время.
Как писал Дейкстра, мы вынуждены накладывать на себя рамки, так как без них мы не сможем контролировать рост сложности, так как мы люди, а следовательно, ограничены.
Я писал про семантический смысл, а не про реализацию.
как раз в семантическом смысле когда вы пишете const int a; это семантически означает что мы определяем переменную a типа int и указываем компилятору что не собираемся менять ее значение.
Нет, семантически, мы просто создаём именованный объект, состояние которого в данном контесте не будет изменяться. А технически мы создаём переменную. И как следствие реализации, мы можем её поменять.
Давайте заменим «не будет», на «не должно» и я буду согласен.

Т.е. у нас есть понятие переменная — именнованный объект
И есть понятие константа — именнованный объект, состояние которого в данном контесте не должно меняться.

Вам не кажеться что исходя из определенния уже видно что второе это частный случай первого?
>> Давайте заменим «не будет», на «не должно» и я буду согласен.
Семантически — не будет. В реализации — не должно.

В том то и дело, что это только кажется. Рассуждая аналогично, но сильно утрировано, деревянный настил — подмножество телеги, так как и там и там у нас есть горизонтальная поверхность куда можно кинуть мешки. Да и если сверху посмотреть — разницы видно.
От наличия кучи констант программа стала о*уенно читабельнее!
Всё было бы ok, если бы не goto !!!
Имхо, данный код достаточно придурошный, что бы стерпеть и готу. Хотя не спорю, лучше было бы заврнуть всё в функцию возвращающую булиан.
а я думал тема про язык Fort, где все операции в стеке проводятся :)
На сколько я помни и в форте была возможность выделять в стеке именованные ячейки, что от переменной не отличается. Да любое слово в словаре можно использовать как переменную.
Без перемененных действительно можно программировать используя РАЯ в среде ДССП :)
Там даже в некотором смысле это приветствуется.
Sign up to leave a comment.

Articles