Давайте сначала посмотрим на f() + g() * h()
.
Старшинство и ассоциативность определяют, что является операндом чего. Например, C приоритет оператора и ассоциативность говорит нам, что
f() + g() * h()
означает
f() + ( g() * h() ) # * has higher precedence than +
, а не
( f() + g() ) * h() # If + had higher precedence than *
Примечательно , приоритет не определяет порядок, в котором вычисляются операнды. В нашем примере три функции могут быть вызваны в любом порядке, если результат g()
и результат h()
умножаются вместе, и что результат умножения добавляется к результату f()
.
Назад к
1 & 0 && ( d = 4 )
Приоритетность и ассоциативность просто говорят нам, что выше эквивалентно следующему:
( 1 & 0 ) && ( d = 4 ) # & has higher precedence than &&
Так, что это делает?
&&
диктует, что его правая часть оценивается только если его левая часть верна. Это называется оценка короткого замыкания или короткое замыкание.
1 & 0
ложно, поэтому d = 4
никогда не оценивается. Это оставляет d
неизменным и, таким образом, неинициализированным.