Postfix имеет более высокий приоритет, чем префикс, поэтому значение sml2 в данном коде должно быть 2, но это 0. Почему? - PullRequest
1 голос
/ 14 апреля 2020
namespace Randomedits
{
    class Program
    {
        static void Main(string[] args)
        {
            int x = 2;
            int sml2 = ++x - (x++) ;
            Console.WriteLine(sml2);
            Console.WriteLine(x);
        }
    }
}

Выход:

0
4

1 Ответ

0 голосов
/ 14 апреля 2020

С Операторы :

Операнды в выражении вычисляются слева направо. Например, в F(i) + G(i++) * H(i) метод F вызывается с использованием старого значения i, затем метод G вызывается со старым значением i и, наконец, метод H вызывается с новое значение i. Это отдельно от приоритета оператора и не связано с ним.

Применяя это к вашему выражению ++x - x++, мы видим, что сначала ++x вычисляется, затем x++ вычисляется, затем вычитание оцененный.

Хороший способ думать о приоритетах операторов состоит в том, что операторы с более высоким приоритетом связываются более тесно , чем операторы с более низким приоритетом. Он используется при определении, в каких выражениях должна быть проанализирована последовательность символов, а не в порядке, в котором они оцениваются.

Например, в выражении ++ x - x ++ оператор ++x связывается более тесно, чем оператор - и оператор x++ связываются более тесно, чем оператор -, поэтому он анализируется как (++x) - (x++). Если бы оператор - имел более высокий приоритет, чем операторы ++x или x++, это выражение было бы проанализировано как ++(x - x)++ (что не имело бы особого смысла).

Тот факт, что ++x имеет более высокий приоритет, чем x++ здесь не имеет значения. имеет значение для выражения ++x++, которое анализируется как (++x)++ вместо ++(x++) (и вызывает ошибку компилятора, поскольку оператор x++ нельзя применить к выражению (++x)).

Как только вы использовали правила приоритета операторов, чтобы выяснить, что ++ x - x ++ должен быть проанализирован как (++x) - (x++), применяются приведенные выше правила, а операнды выражения - оценивается слева направо.

...