Порядок вложенных скобок оценки - Глубина против буквы - PullRequest
0 голосов
/ 03 мая 2018
public static float BackInOut(float from, float to, float time)
{
    const float s = 1.70158f * 1.525f;
    to -= from;
    if ((time /= .5f) < 1f)
        //     5    6      3      4        0         1      2     7
        return to * .5f * (time * time * ((s + 1f) * time - s)) + from;
    //                  3                     0         1      2
    return to * .5f * ((time -= 2) * time * ((s + 1f) * time + s) + 2f) + from;
}

Во втором возврате используется время до (и после) изменения? Да?

    //                  1                     0         2      3
    return to * .5f * ((time -= 2) * time * ((s + 1f) * time + s) + 2f) + from;

Или только после, вот так? ИДК

Спасибо.

источник: http://robertpenner.com/easing/

EDIT:

Пытался упростить:

using System;
namespace New_folder
{
    class Program
    {
        static public int s { get; set; } = 2;
        static private int _test = 10;
        static public int time
        {
            get
            {
                Console.WriteLine(_test);
                return _test;
            }
            set { _test = value; }
        }
        static public void Main(string[] args)
        {
            var test = (time -= 2) * time * ((s + 1f) * time + s);
        }
    }
}

Это показывает: 10 8 8

, который показывает, что мое второе предположение верно, и время используется только после модификации, я думаю

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

спасибо

1 Ответ

0 голосов
/ 03 мая 2018

Упростите пример

Чтобы ответить на ваш вопрос «Во втором возврате используется время до (и после) изменения? Да?»

Как насчет этого?

public int ReturnZeroIfValueIsNegative(int x)
{
    if ((x += 100) <= 100) // the "+=" operator changed the value of x
    {
        return 0;
    }

    return x; // this will return the altered value of x
}

Вышесказанное может быть переписано на

    x = x + 100;

    if (x <= 100)
    {
        return 0;
    }

    return x;

Порядок операций

Вы можете посмотреть здесь для общего объяснения порядка операций для языков программирования.

order of operations in programming languages

...