C#: Порядок функциональной оценки (по сравнению с C)

Тело функции "internalFoo" должно пойти куда-нибудь при парсинге времени, поэтому когда код читается (иначе анализирующий) интерпретатором JS, структура данных для функции создается, и имя присвоено.

Только позже, тогда код выполняется, JavaScript на самом деле пытается узнать, существует ли "internalFoo" и что это и можно ли это назвать, и т.д.

7
задан George Stocker 1 August 2009 в 02:35
поделиться

8 ответов

В C # это слева направо: http://blogs.msdn.com/oldnewthing/archive/2007/08/14/4374222.aspx


Re: Порядок C ++

По-видимому, это потому, что компилятор не может гарантировать, в каком порядке выполняются функции (... почему?)

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

11
ответ дан 6 December 2019 в 08:16
поделиться

From Fabulous Adventures in Coding: Precedence vs Associativity vs Order :

Другой способ взглянуть на это - это правило C # не «сделайте сначала скобки. ", а вместо того, чтобы заключить все в скобки, затем рекурсивно примените правило" оцените левую сторону, затем оцените правую сторону, затем выполните операцию ".

2
ответ дан 6 December 2019 в 08:16
поделиться

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

Это не совсем правильно. K&R разрешил перестановку коммутативных операторов ( отменено в ANSI C ). Поскольку всасывание не коммутативно, оно не переупорядочивается ... по крайней мере по этому правилу.

(Un) к счастью, C также не делает »

1
ответ дан 6 December 2019 в 08:16
поделиться

Я считаю, что в C # список аргументов оценивается по порядку, слева направо.

0
ответ дан 6 December 2019 в 08:16
поделиться

Цвет меня удивил, но, очевидно, C # делает "правильные" вещи и оценивает слева направо:

void Main()
{
    Console.WriteLine(Pop() - Pop()); // Prints -1
}

// Define other methods and classes here
bool switchVar = true;
int Pop()
{
    int ret;
    if (switchVar)
        ret = 1;
    else
        ret = 2;
    switchVar = !switchVar;

    return ret;
}
0
ответ дан 6 December 2019 в 08:16
поделиться

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

Помните, что когда изначально C был разработан, машины были гораздо менее способными, чем сегодня, и было больше интереса предоставить компиляторам свободу действий для оптимизации. Сегодня часто больше внимания уделяется более безопасному и более предсказуемому коду.

5
ответ дан 6 December 2019 в 08:16
поделиться

Нет, C # не делает то же самое. Он не использует границы оценки так же, как C, где порядок выполнения между границами не определен. Выражение вычисляется слева направо, как и следовало ожидать.

Если вы когда-либо не уверены в порядке выполнения или хотите сделать код более понятным, вы должны использовать локальную переменную для промежуточного результата. Локальные переменные очень дешево выделять, поскольку они размещаются в стеке, а в некоторых случаях компилятор даже может поместить переменную в регистр, чтобы она вообще не выделялась. Кроме того, в зависимости от того, как выглядит выражение, компилятору в любом случае может потребоваться использовать локальную переменную для хранения промежуточного результата.

2
ответ дан 6 December 2019 в 08:16
поделиться

Порядок оценки во всех случаях четко определен в C # и выполняется слева направо. Из спецификации языка C # (§7.3):

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

В случае C ++ это не значит, что порядок нельзя определить; это то, что разрешение порядка быть неопределенным позволяет компилятору лучше оптимизировать код.

1
ответ дан 6 December 2019 в 08:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: