Порядок операций для разыменования и ссылки на скобки в C

Если я сделаю *ptr[x], это будет эквивалентно *(ptr[x]) или (*ptr)[x]?


person Claudiu    schedule 24.08.2010    source источник


Ответы (3)


*(ptr[x])

См. таблицу приоритета операторов Википедии или более подробную таблицу эта специфичная для C/C++ таблица.

person Justin Ardini    schedule 24.08.2010
comment
в этой ссылке не упоминается разыменование указателя... но говорится, что доступ к массиву наиболее тесно связан - person Claudiu; 24.08.2010
comment
* находится во 2-й строке таблицы, после [] в 1-й строке. - person Justin Ardini; 24.08.2010
comment
Ах, я понимаю, как это может сбивать с толку, поскольку * может означать умножение или разыменование указателя. Однако умножение идет после, в строке 3 таблицы. - person Justin Ardini; 24.08.2010
comment
ах да, понимание прочитанного для победы. я просматривал текст в поисках упоминания слова «указатель» и не понимал, что это тоже просто унарная операция. - person Claudiu; 24.08.2010
comment
В Википедии также есть подробная таблица приоритетов для C(++). . - person Matthew Flaschen; 24.08.2010
comment
@Matthew: Спасибо, я включил эту таблицу в свой пост. - person Justin Ardini; 24.08.2010
comment
Ура, мой любимый стол. ( en.wikipedia.org/wiki/ ) - person Nick T; 24.08.2010

В C все постфиксные операторы имеют более высокий приоритет, чем префиксные операторы, а префиксные операторы имеют более высокий приоритет, чем инфиксные операторы. Итак, *(ptr[x])

person Chris Dodd    schedule 24.08.2010

Использование движения против часовой стрелки для анализа и разбора этого простого примера

1. starting with ptr, work in counter-clockwise until you hit asterisk operator
2. asterisk, in counter-clockwise until you hit subscript operator
3. we arrive here, at subscript operator [x]

Поскольку [] имеет более высокий приоритет, чем звездочка, согласно этой таблице, это делает его *(ptr[x])

person t0mm13b    schedule 24.08.2010
comment
откуда взялся этот метод против часовой стрелки? - person Claudiu; 24.08.2010
comment
@Claudiu: это хорошо известный метод разбора и анализа выражений C ... его можно найти в «Expert C Programming — Peter Van der Linden», см. stackoverflow.com/questions/2305255/ - person t0mm13b; 24.08.2010
comment
Это для разбора спецификаторов и объявлений типов. Но в вопросе *ptr[x] — это выражение, поэтому все, что вам нужно знать, — это приоритет оператора. - person Steve Jessop; 24.08.2010
comment
Значит, вращение против часовой стрелки не применимо к выражениям? Я бы настоятельно отказался от упоминания об этом, поскольку здесь важен только приоритет оператора. - person Nick T; 24.08.2010