четверг, 13 июня 2019 г.

Спецификация Go: порядок оценки (order of evaluation)

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

Например, в (локально-функциональном) назначении

y[f()], ok = g(h(), i()+x[j()], <-c), k()

вызовы функций и связь происходят в порядке f(), h(), i(), j(), <-c, g() и k(). Однако порядок этих событий по сравнению с оценкой и индексированием x и оценкой y не указан.

a := 1
f := func() int { a++; return a }
x := []int{a, f()}            // x может быть [1, 2] или [2, 2]: порядок вычисления между a и f() не указан
m := map[int]int{a: 1, a: 2}  // m может быть {2: 1} или {2: 2}: порядок оценки между двумя назначениями карты не указан
n := map[int]int{a: f()}      // n может быть {2: 3} или {3: 3}: порядок вычисления между ключом и значением не указан

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

var a, b, c = f() + v(), g(), sqr(u()) + v()

func f() int        { return c }
func g() int        { return a }
func sqr(x int) int { return x*x }

// функции u и v не зависят от всех других переменных и функций

Вызовы функций происходят в порядке u(), sqr(), v(), f(), v() и g().

Операции с плавающей точкой в пределах одного выражения оцениваются в соответствии с ассоциативностью операторов. Явные скобки влияют на оценку, переопределяя ассоциативность по умолчанию.
В выражении x + (y + z) сложение y + z выполняется перед добавлением x.


Читайте также:


Комментариев нет:

Отправить комментарий