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.

questionAnswers(5)

yourAnswerToTheQuestion