Операторы точка и стрелка
От: x-code  
Дата: 05.02.22 13:33
Оценка:
Тема на стыке С/С++ и Философии программирования.
В чем причина того, что в Си ввели отдельный оператор стрелка "->" для доступа к членам класса через указатель?
Ведь и точка с этой функцией вполне бы справилась, там абсолютная однозначность.

Понятно что в С++ появилась возможность перегрузки стрелки и всякие умные указатели и итераторы, а точку решили сделать не перегружаемым оператором. Вроде как стрелка пригодилась.
Но вообще интересно, есть какие-то аргументы в пользу такого разделения?
Визуальное отличие доступа по указателю от доступа по объекту? Так в С++ есть ссылки (указатель который выглядит как объект) и та же перегрузка стрелки (объект который выглядит как указатель). Возможно что-то еще?
Re: Операторы точка и стрелка
От: Pzz Россия https://github.com/alexpevzner
Дата: 05.02.22 13:38
Оценка:
Здравствуйте, x-code, Вы писали:

XC>Тема на стыке С/С++ и Философии программирования.

XC>В чем причина того, что в Си ввели отдельный оператор стрелка "->" для доступа к членам класса через указатель?

Никаких. В языке Go, который является в буквальном смысле наследником Си, это исправлено. Там и для структур и для указателей на структуру используется точка.
Re[2]: Операторы точка и стрелка
От: LaptevVV Россия  
Дата: 05.02.22 13:53
Оценка:
XC>>Тема на стыке С/С++ и Философии программирования.
XC>>В чем причина того, что в Си ввели отдельный оператор стрелка "->" для доступа к членам класса через указатель?
Pzz>Никаких. В языке Go, который является в буквальном смысле наследником Си, это исправлено. Там и для структур и для указателей на структуру используется точка.
А есть ли в Go ручное управление памяти через указатели?
В С++ стрелка применяется обычно для указателей, показывающих на динамический объект, созданный с помощью new().
(Хотя можно записать в указатель адрес не динамического объекта и получить доступ тоже по стрелке)
А точка — только для не динамических объектов.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Операторы точка и стрелка
От: σ  
Дата: 05.02.22 14:04
Оценка: 6 (2) +1
В гугле забанили? https://stackoverflow.com/questions/13366083/why-does-the-arrow-operator-in-c-exist
Re[3]: Операторы точка и стрелка
От: vsb Казахстан  
Дата: 05.02.22 14:04
Оценка: +3
Здравствуйте, LaptevVV, Вы писали:

LVV>А есть ли в Go ручное управление памяти через указатели?

LVV>В С++ стрелка применяется обычно для указателей, показывающих на динамический объект, созданный с помощью new().
LVV>(Хотя можно записать в указатель адрес не динамического объекта и получить доступ тоже по стрелке)
LVV>А точка — только для не динамических объектов.

Ничего не мешает передать динамический объект по ссылке или статический объект по указателю. По-моему это вообще не при чём.
Re[3]: Операторы точка и стрелка
От: Pzz Россия https://github.com/alexpevzner
Дата: 05.02.22 14:05
Оценка:
Здравствуйте, LaptevVV, Вы писали:

Pzz>>Никаких. В языке Go, который является в буквальном смысле наследником Си, это исправлено. Там и для структур и для указателей на структуру используется точка.

LVV>А есть ли в Go ручное управление памяти через указатели?

Аллокация ручная, освобождение — автоматическое. Указатели там примерно такие же, как в Си.

LVV>В С++ стрелка применяется обычно для указателей, показывающих на динамический объект, созданный с помощью new().


А какая разница, в точке использования объекта, откуда взялась память для него?

По-моему, это примерно так же, как использовать одну посуду для картошки, которую ты вырастил на огороде, а другую для той, что куплена в магазине.
Re[4]: Операторы точка и стрелка
От: LaptevVV Россия  
Дата: 05.02.22 14:10
Оценка: +2
Pzz>>>Никаких. В языке Go, который является в буквальном смысле наследником Си, это исправлено. Там и для структур и для указателей на структуру используется точка.
LVV>>А есть ли в Go ручное управление памяти через указатели?
Pzz>Аллокация ручная, освобождение — автоматическое. Указатели там примерно такие же, как в Си.
Значит, не ручное.
В C# и Java тоже пишем new. Только все управление памятью под капотом и указателей фактически нет.
LVV>>В С++ стрелка применяется обычно для указателей, показывающих на динамический объект, созданный с помощью new().
zz>А какая разница, в точке использования объекта, откуда взялась память для него?
ну, можно и через точку (*р).ххх.
Pzz>По-моему, это примерно так же, как использовать одну посуду для картошки, которую ты вырастил на огороде, а другую для той, что куплена в магазине.
Лично для меня важно визуально сразу видеть — это указатель или объект.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[2]: Операторы точка и стрелка
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 05.02.22 14:34
Оценка: +4
Здравствуйте, Pzz, Вы писали:

XC>>Тема на стыке С/С++ и Философии программирования.

XC>>В чем причина того, что в Си ввели отдельный оператор стрелка "->" для доступа к членам класса через указатель?

Pzz>Никаких. В языке Go, который является в буквальном смысле наследником Си, это исправлено. Там и для структур и для указателей на структуру используется точка.


И это, имхо, неудобно. Лично мне так удобнее, сразу видно, где объект, а где — указатель
Маньяк Робокряк колесит по городу
Re[3]: Операторы точка и стрелка
От: LaptevVV Россия  
Дата: 05.02.22 15:03
Оценка:
Pzz>>Никаких. В языке Go, который является в буквальном смысле наследником Си, это исправлено. Там и для структур и для указателей на структуру используется точка.
M>И это, имхо, неудобно. Лично мне так удобнее, сразу видно, где объект, а где — указатель
Совершенно согласен!
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[2]: Операторы точка и стрелка
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 05.02.22 15:10
Оценка:
Здравствуйте, σ, Вы писали:

σ>В гугле забанили? https://stackoverflow.com/questions/13366083/why-does-the-arrow-operator-in-c-exist


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

Прикольное описание, спасибо. Про глобальность пространства имён композитов я знал (хотя вряд ли большинство коллег в курсе), а вот про такую дикую семантику — нет.
The God is real, unless declared integer.
Re: Операторы точка и стрелка
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 05.02.22 15:13
Оценка: +1
Здравствуйте, x-code, Вы писали:

XC>Тема на стыке С/С++ и Философии программирования.

XC>В чем причина того, что в Си ввели отдельный оператор стрелка "->" для доступа к членам класса через указатель?
XC>Ведь и точка с этой функцией вполне бы справилась, там абсолютная однозначность.

Pascal: p.x и p^.x, соответственно. Тоже разделили.

Независимо от того, что тут прозвучало рядом про раннюю семантику "->", это показательно — видимо, хотели уменьшить конфликты.

Заметим, что всяким unique_ptr сейчас это на пользу — имеем возможность писать p->x вместо p.get()->x.
The God is real, unless declared integer.
Re: Операторы точка и стрелка
От: Андрей Тарасевич Беларусь  
Дата: 05.02.22 15:19
Оценка: 36 (7) +2
Здравствуйте, x-code, Вы писали:

XC>Тема на стыке С/С++ и Философии программирования.

XC>В чем причина того, что в Си ввели отдельный оператор стрелка "->" для доступа к членам класса через указатель?

Вам уже дали ссылку на мой ответ на SO. То есть, вкратце: в самых ранних версиях С, еще до K&R, оператор `->` не был эквивалентен комбинации операторов `*` и `.`. У оператора `->` была своя особенная дополнительная функциональность.

Потом эти различия стерлись, `->` стал полным эквивалентом комбинации `*` и `.`, то есть формально он стал излишним. Но удалять из языка его не стали.

Ну и в принципе он дает более компактную и удобочитаемую запись, чем `*` с `.` (которые обычно требуют еще и скобок).
Best regards,
Андрей Тарасевич
Re[2]: Операторы точка и стрелка
От: x-code  
Дата: 05.02.22 15:34
Оценка:
Здравствуйте, Андрей Тарасевич, Вы писали:

АТ>Потом эти различия стерлись, `->` стал полным эквивалентом комбинации `*` и `.`, то есть формально он стал излишним. Но удалять из языка его не стали.

АТ>Ну и в принципе он дает более компактную и удобочитаемую запись, чем `*` с `.` (которые обычно требуют еще и скобок).

Спасибо, очень интересно было узнать про CRM. Хотя я имел в виду не комбинацию точки и звездочки, а просто точку вместо стрелки
Foo obj;
obj.field = 12;
Foo* ptr = &obj;
ptr.field  = 23; // вот прямо так, а не (*ptr).field=23;
Re[3]: Операторы точка и стрелка
От: Андрей Тарасевич Беларусь  
Дата: 05.02.22 16:02
Оценка:
Здравствуйте, x-code, Вы писали:

XC>Здравствуйте, Андрей Тарасевич, Вы писали:


АТ>>Потом эти различия стерлись, `->` стал полным эквивалентом комбинации `*` и `.`, то есть формально он стал излишним. Но удалять из языка его не стали.

АТ>>Ну и в принципе он дает более компактную и удобочитаемую запись, чем `*` с `.` (которые обычно требуют еще и скобок).

XC>Спасибо, очень интересно было узнать про CRM. Хотя я имел в виду не комбинацию точки и звездочки, а просто точку вместо стрелки


А, понял. Ну тогда это вторая часть ответа. Опять же, в старинном C оператор `.` тоже обладал некоторыми "необычными" свойствами, которые были несовместимы с этой идеей. Цитата из "C Reference Manual"

7.1.7 primarylvalue.memberofstructure
An lvalue expression followed by a dot followed by the name of a member of a structure is a primary expression.
The object referred to by the lvalue is assumed to have the same form as the structure containing the structure member.
The result of the expression is an lvalue appropriately offset from the origin of the given lvalue whose type is
that of the named structure member. The given lvalue is not required to have any particular type.

То есть слева от точки можно было использовать что угодно. Главное, чтобы это было lvalue.
Best regards,
Андрей Тарасевич
Отредактировано 05.02.2022 16:05 Андрей Тарасевич . Предыдущая версия . Еще …
Отредактировано 05.02.2022 16:03 Андрей Тарасевич . Предыдущая версия .
Re[2]: Операторы точка и стрелка
От: Shtole  
Дата: 05.02.22 19:51
Оценка:
Здравствуйте, σ, Вы писали:

σ>В гугле забанили? https://stackoverflow.com/questions/13366083/why-does-the-arrow-operator-in-c-exist


А если внимательно и непредубеждённо прочитать, что там написано?

А написано там, среди прочего, что когда-то в языке Си можно было писать:

100->a = 0;


А сейчас так писать нельзя! Не знаю, в курсе ли вы, что нацисты продули вторую мировую так сейчас нельзя писать.

Спрашивается: если этот язык так адски колбасило на ранних стадиях, почему же стрелка дожила до наших дней? Вернее, почему автор ответа не понимает, что история языка, приводимая им как аргумент, служит ещё и аргументом того, что на историю в этом случае опираться вообще нельзя?

Мой ответ на вопрос топикстартера такой: в языке с ручным управлением памятью жизненно важно для написания надёжных программ видеть разницу между указателем и экземпляром. Поэтому разделение и прижилось. (Неважно, по каким причинам оно появилось).

P.S. Не посмотрел, кто автор ответа. «Ой. Неловко получилось!»
Do you want to develop an app?
Отредактировано 05.02.2022 19:54 Shtole . Предыдущая версия .
Re[3]: Операторы точка и стрелка
От: Pzz Россия https://github.com/alexpevzner
Дата: 05.02.22 20:57
Оценка: +1
Здравствуйте, Marty, Вы писали:

Pzz>>Никаких. В языке Go, который является в буквальном смысле наследником Си, это исправлено. Там и для структур и для указателей на структуру используется точка.


M>И это, имхо, неудобно. Лично мне так удобнее, сразу видно, где объект, а где — указатель


Я только не очень понимаю, зачем тебе это видеть.

К тому же, в C++ все больше референсы, а не указатели, так что тебя от этого удобства в значительной части избавили.
Re[4]: Операторы точка и стрелка
От: Sm0ke Россия ksi
Дата: 05.02.22 21:35
Оценка:
Здравствуйте, Андрей Тарасевич, Вы писали:

АТ>Здравствуйте, x-code, Вы писали:


XC>>Здравствуйте, Андрей Тарасевич, Вы писали:


АТ>>>Потом эти различия стерлись, `->` стал полным эквивалентом комбинации `*` и `.`, то есть формально он стал излишним. Но удалять из языка его не стали.

АТ>>>Ну и в принципе он дает более компактную и удобочитаемую запись, чем `*` с `.` (которые обычно требуют еще и скобок).

XC>>Спасибо, очень интересно было узнать про CRM. Хотя я имел в виду не комбинацию точки и звездочки, а просто точку вместо стрелки


АТ>А, понял. Ну тогда это вторая часть ответа. Опять же, в старинном C оператор `.` тоже обладал некоторыми "необычными" свойствами, которые были несовместимы с этой идеей. Цитата из "C Reference Manual"


АТ>7.1.7 primarylvalue.memberofstructure

АТ>An lvalue expression followed by a dot followed by the name of a member of a structure is a primary expression.
АТ>The object referred to by the lvalue is assumed to have the same form as the structure containing the structure member.
АТ>The result of the expression is an lvalue appropriately offset from the origin of the given lvalue whose type is
АТ>that of the named structure member. The given lvalue is not required to have any particular type.

АТ>То есть слева от точки можно было использовать что угодно. Главное, чтобы это было lvalue.


Теперь c++ запрещает ставить точку после указателя.
my_class * p = new my_class();
p.member_; // ошибка компиляции

И этот момент можно использовать, чтобы разрешить это, но возвращать результат как у оператора стрелочка.
Понятно, что в си без плюсов этот номер не прокатит пока что.
Re[3]: Операторы точка и стрелка
От: Андрей Тарасевич Беларусь  
Дата: 06.02.22 00:16
Оценка:
Здравствуйте, Shtole, Вы писали:

S>Спрашивается: если этот язык так адски колбасило на ранних стадиях, почему же стрелка дожила до наших дней? Вернее, почему автор ответа не понимает, что история языка, приводимая им как аргумент, служит ещё и аргументом того, что на историю в этом случае опираться вообще нельзя?


Не понимаю этого тезиса. Что сейчас, что тогда вопросы обратной совместимости и поддержки легаси кода играли свою роль в принятии решений об удалении каких-то фич языка. В тем времена, полагаю, все было даже проще: уже просто потому, что какой-нибудь "Боб" из соседнего кубика использовал оператор `->` в своем коде, его могли оставить в языке.
Best regards,
Андрей Тарасевич
Re[4]: Операторы точка и стрелка
От: Shtole  
Дата: 06.02.22 01:10
Оценка: +1
Здравствуйте, Андрей Тарасевич, Вы писали:

S>>Спрашивается: если этот язык так адски колбасило на ранних стадиях, почему же стрелка дожила до наших дней? Вернее, почему автор ответа не понимает, что история языка, приводимая им как аргумент, служит ещё и аргументом того, что на историю в этом случае опираться вообще нельзя?


АТ>Не понимаю этого тезиса. Что сейчас, что тогда вопросы обратной совместимости и поддержки легаси кода играли свою роль в принятии решений об удалении каких-то фич языка. В тем времена, полагаю, все было даже проще: уже просто потому, что какой-нибудь "Боб" из соседнего кубика использовал оператор `->` в своем коде, его могли оставить в языке.


Так ведь с тем же успехом «Боб» мог использовать имя поля из одной структуры для указания оффсета в другой. (Я про такое даже не знал, поэтому за исторический экскурс спасибо). Но эту же возможность выкинули. Я из этого делаю прямо противоположный вывод, что дело в не том, как там было исторически, а в том, что невыкинутые фишки, в т.ч. разделение селекторов на точку и стрелочку было чем-то полезным. Я и предположил, чем: удобством видеть, где указатели, а где экземпляры.
Do you want to develop an app?
Re[5]: Операторы точка и стрелка
От: Андрей Тарасевич Беларусь  
Дата: 06.02.22 21:37
Оценка: 18 (1)
Здравствуйте, Shtole, Вы писали:

S>Здравствуйте, Андрей Тарасевич, Вы писали:


S>>>Спрашивается: если этот язык так адски колбасило на ранних стадиях, почему же стрелка дожила до наших дней? Вернее, почему автор ответа не понимает, что история языка, приводимая им как аргумент, служит ещё и аргументом того, что на историю в этом случае опираться вообще нельзя?


АТ>>Не понимаю этого тезиса. Что сейчас, что тогда вопросы обратной совместимости и поддержки легаси кода играли свою роль в принятии решений об удалении каких-то фич языка. В тем времена, полагаю, все было даже проще: уже просто потому, что какой-нибудь "Боб" из соседнего кубика использовал оператор `->` в своем коде, его могли оставить в языке.


S>Так ведь с тем же успехом «Боб» мог использовать имя поля из одной структуры для указания оффсета в другой. (Я про такое даже не знал, поэтому за исторический экскурс спасибо). Но эту же возможность выкинули. Я из этого делаю прямо противоположный вывод, что дело в не том, как там было исторически, а в том, что невыкинутые фишки, в т.ч. разделение селекторов на точку и стрелочку было чем-то полезным. Я и предположил, чем: удобством видеть, где указатели, а где экземпляры.


Да, это так. Но чисто интуитивно я предполагаю, что даже на ранних стадиях развития С все таки "мейнстримовым"/преобладающим использованием оператора `->` было его более "ортодоксальное" использование — то есть использование со строго типизацией, такое, с которым мы работаем сегодня.

С другой стороны, язык С, описанный в CRM, обладал и другими вопиющими несовместимостями с K&R: операторы `+=` записывались "наоборот" как `=+` и т.п. А это, как мне предполагается, тоже довольно популярные операторы. Так что вполне возможно, что я преувеличиваю роль обратной совместимости в принятии решений по таким вопросам в те времена. Вполне возможно что "ненужный" оператор `->` сохранился в языке просто вследствие своего удобства. Это — постфиксный оператор, т.е. в отличие от префиксного `*` его применение не требует дополнительных скобок. Это — уже хорошая причина для его сохранения.
Best regards,
Андрей Тарасевич
Отредактировано 06.02.2022 21:39 Андрей Тарасевич . Предыдущая версия .
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.