Приоритет оператора и определение структуры в C - PullRequest
0 голосов
/ 17 марта 2010
struct struct0 {
  int a;
};

struct struct1 {
  struct struct0 structure0;
  int b;
} rho;


&rho->structure0; /* Reference 1 */
(struct struct0 *)rho; /* Reference 2 */
(struct struct0)rho; /* Reference 3 */
  1. Из ссылки 1 берет ли компилятор адрес rho, а затем получает доступ к Structure0 или наоборот?

  2. Что делает строка в ссылке 2?

  3. Поскольку структура 0 является первым членом структуры struct1, ссылка 3 будет эквивалентна ссылке 1?

Ответы [ 2 ]

4 голосов
/ 17 марта 2010

В порядке ваших ссылок:

  1. -> имеет более высокий приоритет, чем &. Вы получите адрес rho->structure0. Вернее, вы бы указали rho. Поскольку это не так, вы получите ошибку компиляции.
  2. Это не сработает - вы приводите структуру к типу указателя - вы должны получить ошибку компилятора при этом.
  3. Вы тоже не можете этого сделать. Типовое преобразование к нескалярному типу также является ошибкой.

Ваши примеры № 2 и № 3 описаны в стандартном разделе 6.5.4:

Если имя типа не указывает тип void, имя типа должно указывать квалифицированное или неквалифицированный скалярный тип и операнд должны иметь скалярный тип.

Если вы поместите любой из этого кода в компилятор, вы увидите те же результаты; код, который вы показываете, не тот, о котором вы хотели спросить?

2 голосов
/ 17 марта 2010
&rho->structure0; /* Reference 1 */
(struct struct0)rho; /* Reference 3 */
(struct struct0 *)rho; /* Reference 2 */

Все три ссылки неверны:

  • rho не указатель.Таким образом, вы не можете сделать rho->structure0, но (&rho)->structure0
  • Вы не можете преобразовать переменную в указатель, поэтому вы не можете сделать (struct struct0)rho;, но (struct struct0 *)&rho

IЯ не совсем понимаю, что ты хочешь делать, поэтому я не могу тебе сильно помочь.

...