Como uma declaração 'if (A && B)' é avaliada?
if( (A) && (B) )
{
//do something
}
else
//do something else
A questão é: a afirmação seria imediatamente interrompida se A fosse FALSO? B seria mesmo avaliado?
Eu pergunto isso no caso que B verificando a validade de um índice de array diz array [0] quando o array está realmente vazio e tem zero elementos. Portanto, jogando um segfault porque estamos tentando acessar algo que está fora dos limites da matriz. Especificamente
if( (array.GetElements() > 0) && (array[0]))
array[0]->doSomething();
else
//do nothing and return
Isso pode ser perigoso se array [0] for realmente avaliado por causa dos segfaults sem a primeira verificação à esquerda do '&&'. Precedência me diz que o lado esquerdo definitivamente terá precedência, mas não me diz que não avaliará o lado direito se a esquerda for FALSE.