Мне нравятся ответы Ориона. Я добавлю две вещи:
- Слева направо по-прежнему применяется первым
- Внутренний-внешний, чтобы все аргументы были разрешены перед вызовом функции
Скажем, у нас есть следующий пример:
a = Foo(5, GetSummary("Orion", GetAddress("Orion")),
GetSummary("Chris", GetAddress("Chris")));
Вот порядок исполнения:
GetAddress("Orion")
GetSummary("Orion", ...)
GetAddress("Chris")
GetSummary("Chris", ...)
Foo(...)
- Назначает
a
Я не могу говорить о юридических требованиях C # (хотя я тестировал подобный пример с использованием Mono перед написанием этого поста), но этот порядок гарантирован в Java.
И просто для полноты (поскольку это также не зависящий от языка поток), существуют языки, такие как C и C ++, где порядок не гарантируется, если нет точки последовательности. Список литературы: 1 , 2 . Однако, отвечая на вопрос потока, &&
и ||
являются точками последовательности в C ++ (если не перегружены; также см. Отличный ответ OJ). Вот несколько примеров:
foo() && bar()
foo() & bar()
В случае &&
гарантированно будет выполняться foo()
до bar()
(если последний вообще выполняется), поскольку &&
является точкой последовательности. В случае &
такая гарантия не предоставляется (в C и C ++), и действительно, bar()
может работать до foo()
или наоборот.