if((i == 0) || (j/i == 1)) -> primeira condição já retorna true e não testa a segunda, portanto como não teste a segunda condição não vai dar a exception
if((i == 0) | (j/i == 1)) -> o operador | vai testar necessariamente as duas condições. Ao testar a segunda condição vai dar erro por causa da divisão por zero
if((i != 0) && (j/i == 1)) -> a primeira condição já retorna false e não testa a segunda, portanto como não teste a segunda condição não vai dar a exception
if((i != 0) & (j/i == 1)) -> o a segunda condição vai ser testada mesmo a primeira sendo false por causa o operador &. Ao testar a segunda condição vai dar erro por causa da divisão por zero
Só pra vocês brincarem:
:arrow: Se vc fizer 4 | 2 vai dar 6
:arrow: Se vc fizer 7 | 10 vai dar 15
:arrow: Se vc fizer 4 & 2 vai dar 0
:arrow: Se vc fizer 7 & 10 vai dar 2
:arrow: Se vc fizer 4 ^ 2 vai dar 6
:arrow: Se vc fizer 7 ^ 10 vai dar 13
Quer saber mais? Pesquise por “operadores bit-a-bit”