Почему x ++ имеет более высокий приоритет, чем ++ x? - PullRequest
8 голосов
/ 07 февраля 2010

Какой смысл в постинкрементном операторе ++, имеющем более высокий приоритет, чем в преинкрементном операторе ++? Таким образом, существует ли ситуация, когда x ++, имеющий тот же уровень приоритета, что и ++ x, заставил бы выражение возвращать неверный результат?

Ответы [ 2 ]

17 голосов
/ 07 февраля 2010

Давайте начнем с определения некоторых терминов, чтобы мы все говорили об одном и том же.

первичные операторы - это постфикс «x ++» и «x--», оператор доступа к члену «xy», оператор вызова «f (x)», оператор разыменования массива «a [x» ] ", а также новые операторы typeof, default, флажок, непроверенный и делегировать.

унарные операторы: "+ x", "-x", "~ x", "! X", "++ x", "--x" и приведение "(T ) х».

Первичные операторы по определению имеют более высокий приоритет, чем унарные операторы.

Ваш вопрос

существует ли ситуация, когда x ++, имеющий тот же уровень приоритета, что и ++ x, заставил бы выражение возвращать неверный результат?

Мне совершенно не понятно, что вы подразумеваете под логически под "неправильным результатом". Если мы изменили правила приоритета таким образом, что значение выражения изменилось, тогда новый результат будет правильный результат . Правильный результат - независимо от того, что правила говорят , правильный результат - . Вот как мы определяем «правильный результат» - правильный результат - это то, что вы получаете, когда правильно применяете правила.

Мы пытаемся настроить правила так, чтобы они были полезными и , чтобы было проще выразить значение, которое вы намереваетесь выразить . Это то, что вы подразумеваете под "неправильным результатом"? То есть вы спрашиваете, есть ли ситуация, когда интуиция о том, что правильный ответ был бы неправильной?

Я утверждаю, что если это так, то это бесполезный подход, потому что почти никто не догадывается, что "правильная" операция операторов приращения фактически соответствует текущей спецификации, намного меньше некоторой гипотетической контрафактной спецификации . Почти в каждой книге C #, которую я редактировал, автор каким-то тонким или грубым образом неправильно указал значение операторов приращения.

Это побочные операции с необычной семантикой, и они исходят из языка - C - с намеренно неопределенной операционной семантикой. Мы очень старались в определении C # сделать операторы увеличения и уменьшения разумными и строго определенными, но невозможно придумать что-то, что имеет интуитивно понятный смысл для всех, поскольку у каждого разный опыт работы с операторами в C и C ++. .

Возможно, было бы полезно подойти к проблеме под другим углом. Ваш вопрос предполагает противоречивый мир, в котором для postfix и prefix ++ указано одинаковое преимущество, а затем просит критиковать этот выбор дизайна в этом противоречивом мире. Но есть много разных способов, которые могут произойти. Мы можем сделать так, чтобы они имели одинаковый приоритет, поместив оба в «первичную» категорию. Или мы можем сделать так, чтобы они имели одинаковый приоритет, поместив их обоих в «унарную» категорию. Или мы могли бы изобрести новый уровень приоритета между первичным и унарным. Или ниже одинарного. Или выше основного. Мы также можем изменить ассоциативность операторов, а не только их приоритет.

Возможно, вы могли бы прояснить вопрос о том, какой контрафактный мир вы бы хотели критиковать. Принимая во внимание любой из этих контрафактов, я могу подвергнуть вас критике за то, как этот выбор приведет к тому, что код будет излишне многословным или запутанным, но без четкой концепции контрафактного дизайна, который вы критикуете, я боюсь Потратьте много времени на критику чего-то другого, кроме того, что вы на самом деле имеете в виду.

Сделайте конкретное предлагаемое изменение дизайна, и мы увидим, каковы его последствия.

2 голосов
/ 08 февраля 2010

Джон, вы сами ответили на вопрос: эти две конструкции в основном используются для вызовов функций: ++x - когда вы хотите сначала увеличить значение, а затем вызвать функцию, и x++, когда вы хотите вызвать функции, а затем сделать увеличение. Это может быть очень полезно, в зависимости от контекста. Глядя на return x++ против return ++x, я не вижу смысла в ошибке: код точно означает, как он читает :) Единственная проблема - это программист, который может использовать эти две конструкции, не понимая приоритет оператора и, таким образом, упуская значение.

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