Здравствуйте, Shtole, Вы писали:
S>Так ведь с тем же успехом «Боб» мог использовать имя поля из одной структуры для указания оффсета в другой.
Ну, хотя такая возможность и была, дядя Боб из соседнего кубикла был бы полным чудаком, если бы этим пользовался. Я так понимаю, это таки была не фича языка, а недоработка. А чтобы не путаться,
как уже выше кто-то писал, поля структур прекфиксили:
Скрытый текст
struct stat {
dev_t st_dev; /* устройство */
ino_t st_ino; /* inode */
mode_t st_mode; /* режим доступа */
nlink_t st_nlink; /* количество жестких ссылок */
uid_t st_uid; /* идентификатор пользователя-владельца */
gid_t st_gid; /* идентификатор группы-владельца */
dev_t st_rdev; /* тип устройства */
/* (если это устройство) */
off_t st_size; /* общий размер в байтах */
blksize_t st_blksize; /* размер блока ввода-вывода */
/* в файловой системе */
blkcnt_t st_blocks; /* количество выделенных блоков */
time_t st_atime; /* время последнего доступа */
time_t st_mtime; /* время последней модификации */
time_t st_ctime; /* время последнего изменения */
};
Здравствуйте, Marty, Вы писали:
S>>Так ведь с тем же успехом «Боб» мог использовать имя поля из одной структуры для указания оффсета в другой. M>Ну, хотя такая возможность и была, дядя Боб из соседнего кубикла был бы полным чудаком, если бы этим пользовался.
Иными словами: есть объективно хорошие фичи, а есть не очень, а история тут не при чём. Что я сразу и написал.
Здравствуйте, Shtole, Вы писали:
S>>>Так ведь с тем же успехом «Боб» мог использовать имя поля из одной структуры для указания оффсета в другой. M>>Ну, хотя такая возможность и была, дядя Боб из соседнего кубикла был бы полным чудаком, если бы этим пользовался.
S>Иными словами: есть объективно хорошие фичи, а есть не очень, а история тут не при чём. Что я сразу и написал.
Я думаю, история тут при чем. Если бы дядя Боб был чудаком, то и дерьмовая фича бы осталась
Здравствуйте, Андрей Тарасевич, Вы писали:
АТ>Вполне возможно что "ненужный" оператор `->` сохранился в языке просто вследствие своего удобства. Это — постфиксный оператор, т.е. в отличие от префиксного `*` его применение не требует дополнительных скобок. Это — уже хорошая причина для его сохранения.
Так и "точка" — постфиксный оператор. Правило "если это указатель, точка адресует члены структурного типа по этому указателю" ничем бы не испортило язык, реализовалось бы банально и устранило бы различие двух операторов. Изначальный вопрос именно в этом.
Поэтому, если было какое-то удобство, которое привело к его сохранению, то это, скорее всего, удобство понимания отличия непосредственного значения в переменной от указателя — для человека.
Вот было ли это удобство и в чём точно оно заключалось, или просто не совершили объединение — исходный вопрос.
N>Прикольное описание, спасибо. Про глобальность пространства имён композитов я знал (хотя вряд ли большинство коллег в курсе), а вот про такую дикую семантику — нет.
И всё же её остатки ещё существуют до сих пор в виде `0[array]`.
Здравствуйте, netch80, Вы писали:
N>Поэтому, если было какое-то удобство, которое привело к его сохранению, то это, скорее всего, удобство понимания отличия непосредственного значения в переменной от указателя — для человека. N>Вот было ли это удобство и в чём точно оно заключалось, или просто не совершили объединение — исходный вопрос.
В Си нет ссылок, поэтому в нем такие записи однозначно говорят о том, что происходит.
С точками понятно, что имеем просто доступ к какому-то подчлену структуры:
a.b.c.d; // == *(&a + offset)
А со стрелками понятно, что там последовательность косвенных обращений, что дороже: