это знак минус, за которым
pd->year
является новой. Если p - указатель на структуру, то
p-> член структуры ------------------
обращается к конкретному члену. (Операция -> - это знак минус, за которым следует знак ">".)
Так как pd указывает на структуру, то к члену year можно обратиться и следующим образом
(*pd).year
но указатели структур используются настолько часто, что запись -> оказывается удобным сокращением. круглые скобки в (*pd).year необходимы, потому что операция указания члена структуры старше , чем *. Обе операции, "->" и ".", ассоциируются слева направо, так что конструкции слева и справа эквивалентны
p->q->memb (p->q)->memb emp.birthdate.month (emp.birthdate).month
Для полноты ниже приводится другая функция, month_day, переписанная с использованием структур.
month_day(pd) /* set month and day from day of year */ struct date *pd; { int i, leap;
leap = pd->year % 4 == 0 && pd->year % 100 != 0 || pd->year % 400 == 0; pd->day = pd->yearday; for (i = 1; pd->day > day_tab[leap][i]; i++) pd->day -= day_tab[leap][i]; pd->month = i; }
Операции работы со структурами "->" и "." наряду со () для списка аргументов и [] для индексов находятся на самом верху иерархии старшинства операций и, следовательно, связываются очень крепко. Если, например, имеется описание
struct { int x; int *y; } *p;
то выражение
++p->x
увеличивает x, а не p, так как оно эквивалентно выражению ++(p->х). Для изменения порядка выполнения операций можно использовать круглые скобки: (++p)->x увеличивает p до доступа к x, а (p++)->x увеличивает p после. (Круглые скобки в последнем случае необязательны. Почему?)
Совершенно аналогично *p->y извлекает то, на что указывает y; *p->y++ увеличивает y после обработки того, на что он указывает (точно так же, как и *s++); (*p->y)++ увеличивает то, на что указывает y; *p++->y увеличивает p после выборки того, на что указывает y.
Содержание Назад Вперед