На самом деле, в C этот код
(a>b)?b=a:b=b;
анализируется многими компиляторами как
((a>b)?b=a:b)=b;
, что является ошибкой, поскольку выражение ((a>b)?b=a:b)
оценивается как rvalue , который вы пытаетесь присвоить с помощью b
, что приводит к ошибке.Попытка присвоить rvalue является ошибкой.Если он не анализируется таким образом, то это просто ошибка синтаксис .Но компилятору C НЕ разрешается анализировать его как:
((a>b)?b=a:(b=b)); //not allowed to parse by C language
Поскольку грамматика C не позволяет компилятору анализировать код, как указано выше.
Но то, что вы написали(исходный код) корректен как C ++.
Здесь грамматика C и C ++ сильно отличается.И из-за этой разницы вы видите, что оба языка трактуют выражение по-разному.То есть the conditional expression in C++
отличается от the conditional expression in C
.
В Википедии есть очень хорошее и правильное объяснение для этого:
Связывание операторов в C и C ++ определяется (в соответствующих стандартах) факторизованной грамматикой языка, а не таблицей приоритетов. Это создает некоторые тонкие конфликты.Например, в C синтаксис для условного выражения:
выражение логического ИЛИ?выражение: условное выражение
в то время как в C ++ это:
логическое ИЛИ-выражение?выражение: присваивание-выражение
Следовательно, выражение:
e = a
анализируется по-разному на двух языках.В C это выражение является синтаксической ошибкой, но многие компиляторы анализируют его как:
e = ((a
, что является семантической ошибкой,поскольку результат условного выражения (который может быть ++) не является lvalue.В C ++ он анализируется как:
e = (a
, которое является допустимым выражением.