演算子の優先順位

なんで以下のコードで hoge が出力されるか 30分くらい悩む…。
0 && 1 で false だから、強制で抜けるのかと思い込み。

int main(void)
{
    // 必ず 1 になってしまう。。。
    if (0 && 1 || 1 ) { 
        printf("hoge\n");
    }   
}


自分がやりたかったことは、本当はこう。

int main(void)
{
    if (0 && (1 || 1) ) { 
        printf("hoge\n");
    }   
}

分かり難い書き方なので、今度からは避けようと思う。