It depends on how many such conditions there are, and what the "most common" case is. If there are several conditions, then I would prefer the second form, because it's easier to follow and to debug. Compare:
// first way
for (int i = 0 ; i < MAX ; i ++)
{
if (someCondition && someOtherCondition && unrelatedCrap &&
whyIsThisHere && isThereAnyCoffeeLeft)
{
foo () ;
bar () ;
}
}
// second way
for (int i = 0 ; i < MAX ; i ++)
{
if (!someCondition)
{
continue;
}
if (!someOtherCondition )
{
continue;
}
if (!unrelatedCrap )
{
continue;
}
if (!whyIsThisHere )
{
continue;
}
if (!isThereAnyCoffeeLeft)
{
continue;
}
foo () ;
bar () ;
}
The second form is much longer, true, but note that now I can put debug breakpoints on each individual "continue" statements, so when one of the conditions fails I can explicitly see which one it was. Similarly, if I put an uncommon condition in its own if/continue block, then I can put a breakpoint on it and add logging to catch that case. In the "real world", each of those single variables in the condition might be giant expressions in and of themselves, so separating them helps make them more understandable, too.
If there's only one condition and you expect to be the most common one, I would say go with the first one, as it's more straightforward and only one condition that could fail.