Разве это нормально для некоторых выражений C, разрешенных в его грамматике, которые не допускаются при компиляции на практике? - PullRequest
1 голос
/ 07 апреля 2019

Я изучал грамматику C: http://www.quut.com/c/ANSI-C-grammar-y-1999.html#unary-expression

Там есть это правило

assignment_expression
: conditional_expression
| unary_expression assignment_operator assignment_expression
;

А

unary_expression
: postfix_expression
| INC_OP unary_expression
| DEC_OP unary_expression
| unary_operator cast_expression
| SIZEOF unary_expression
| SIZEOF '(' type_name ')'
;

Так почему мы не можем сделать что-то вроде:

++v = 3<4 ? 10 : 2;

поскольку ++ v является выражением unary_expression?

Ответы [ 2 ]

3 голосов
/ 07 апреля 2019

Да, это нормально. Язык Си определяется несколькими уровнями правил. Грубо говоря, как введение:

  • Отдельные символы собираются в токены предварительной обработки в соответствии с лексическими правилами C.
  • Грамматика определяет, какие последовательности токенов предварительной обработки разрешены, а также то, как они интерпретируются (структурированы в виде дерева).
  • Ограничения, указанные в стандарте C, добавляют семантические правила, которые грамматика не в состоянии указать. Например, ограничение на оператор присваивания состоит в том, что он должен иметь изменяемое значение lvalue в качестве своего левого операнда.
  • Дополнительные правила в стандарте C определяют семантику и дополнительные требования.
1 голос
/ 08 апреля 2019

Грамматика языка - это только одна часть определения языка.Существуют дополнительные семантические правила и ограничения , которые указывают, что только синтаксис не может.Например, один только синтаксис не может указывать, что переменные и функции должны быть объявлены перед использованием, или что операнд унарного оператора * должен иметь тип указателя и т. Д.

Существует ограничение на выражения присваивания, которыецелью назначения должно быть модифицируемое значение l 100 * *, которое является выражением, которое задает область памяти, так что содержимое этой области может быть прочитано или обновлено.Если v является именем переменной, то она также служит lvalue.

Однако семантические правила оператора ++ гласят, что результатом ++v является , а не lvalue, и как таковая не может быть целью назначения.

Глава и стих по всем этим вопросам см. В C 2011 г. онлайн-проекте , разделы 6.3.2.1 (L-значения, массивы и обозначения функций), 6.5.3 (унарные операторы)и 6.5.16 (операторы присваивания).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...