Битовый сдвиг << и приоритет умножения * - PullRequest
0 голосов
/ 10 июля 2020

Пробовал этот код на Go детской площадке :

package main

import (
    "fmt"
)

func main() {
    log2Dim := uint32(9)
    
    SIZE := 1 << 3 * log2Dim
    fmt.Printf("Result: %v\n", SIZE)
    
    SIZE = 1 << (3 * log2Dim)            // => only difference: adding ( )
    fmt.Printf("Result: %v\n", SIZE)
}

Это распечатано:

Result: 72
Result: 134217728

Почему это имеет огромное значение, просто добавляя ( ) к оператору, содержащему операции << и *?

Согласно this , * имеет более высокий приоритет, чем <<, который является первым результатом поиска Google приоритет битового сдвига golang.

Ответы [ 2 ]

4 голосов
/ 10 июля 2020

Страница, на которую вы ссылаетесь, неверна. Существует только один spe c для Go, и довольно ясно, что приоритет операторов :

Существует пять уровней приоритета для бинарных операторов. Операторы умножения связывают сильнее всего, за ними следуют операторы сложения, операторы сравнения, && (логическое И) и, наконец, || (логическое ИЛИ):

    5             *  /  %  <<  >>  &  &^
    4             +  -  |  ^
    3             ==  !=  <  <=  >  >=
    2             &&
    1             ||

Бинарные операторы с одинаковым приоритетом связываются слева направо. Например, x / y * z совпадает с (x / y) * z.

Умножение и битовый сдвиг имеют одинаковый уровень приоритета, поэтому применяется правило «слева направо», что делает ваш код эквивалентен (1 << 3) * log2Dim

Обратите внимание, что слева направо означает в коде , а не в таблице приоритетов . Это видно на примере, приведенном в SPE c.

1 голос
/ 10 июля 2020

Существует пять уровней приоритета для бинарных операторов. * и << имеют одинаковый уровень приоритета: 5. Бинарные операторы с одинаковым приоритетом связываются слева направо, поэтому 1 << 3 * log2Dim эквивалентно (1 << 3) * log2Dim.

Источник: https://golang.org/ref/spec#Operators

...