以下の処理を見ていて論理演算子が分からなくなってしまったので教えて下さい。

前提:
4年に一度は閏年
でも100年毎は閏年ではない
ただし400年毎は閏年

@months = ("0", "31", "28", "31", "30", "31", "30", "31", "31", "30", "31", "30", "31");
if (($year%4) == "0" || ($year%100) != "0" && ($year%400) == "0") { $months[2] = "20"; }

三つの式が『||』と『&&』の二つの論理演算子でifの条件文が作られているわけ
ですが、『($year%4) == "0"』と『($year%100) != "0"』と『($year%400) == "0"』の関
係と、その中での『||』と『&&』の関係が知りたいです。

上述のif条件文だとうまく処理されないのに、条件文を
(($year%4) == "0" || ($year%100) != "0" and ($year%400) == "0")
もしくは
((($year%4) == "0" || ($year%100)) != "0" && ($year%400) == "0")

にするとうまくいくんです…。

参考書に書いてある優先順位の意味も分からないし…。

宜しくお願いします。