TL; DR Faça o que for melhor em sua circunstância particular
Vamos dar um exemplo:
for ( int i = 1; i < array.length; i++ )
{
if(something) break;
// perform operations
}
Nesse caso, não queremos que qualquer código no loop for seja executado se something
for true, portanto, mover o teste de something
para o campo de condição é razoável.
for ( int i = 1; i < array.length && !something; i++ )
Então, novamente, dependendo se something
pode ser definido como true
antes do loop, mas não dentro dele, isso pode oferecer mais clareza:
if(!something)
{
for ( int i = 1; i < array.length; i++ )
{...}
}
Agora imagine isso:
for ( int i = 1; i < array.length; i++ )
{
// perform operations
if(something) break;
// perform more operations
}
Estamos enviando uma mensagem muito clara por lá. Se something
se tornar verdadeiro durante o processamento da matriz, abandone a operação inteira nesse ponto. Para mover o cheque para o campo de condição, você precisa fazer:
for ( int i = 1; i < array.length && !something; i++ )
{
// perform operations
if(!something)
{
// perform more operations
}
}
Indiscutivelmente, a "mensagem" tornou-se enlameada, e estamos verificando a condição de falha em dois lugares - e se a condição de falha mudar e esquecermos um desses lugares?
Existem, é claro, muito mais formas diferentes para loop e condição, todas com suas próprias nuances.
Escreva o código para que ele leia bem (isso é obviamente um tanto subjetivo) e de forma concisa. Fora de um conjunto draconiano de diretrizes de codificação, all "rules" tem exceções. Escreva o que você acha que expressa melhor a decisão e minimize as chances de erros futuros.