Вопрос касается использования ({})-расширения.
for(int i=0;i<3;({break;}));
-> error: break statement not within loop or switch
for(int i=0;i<3;i++)
for(int j=0;j<3;({break;}))
printf("%d - %d\n",i,j);
-> 0 - 0
1 - 0
2 - 0
То есть в первом случае компилятор не дает использовать ({break;}) внутри «шапки» (не знаю, как правильно назвать) цикла, а во втором преспокойно обрывает цикл, в шапке которого он указан. Получается, на этапе обработки семантических ошибок он рассматривает брэйк внутри внешнего цикла, а на этапе трансляции перемещает его во внутренний.
Гцц-4.4.4, сейчас собираю 4.5.2. Раньше, емнип, такого безобразия я не наблюдал, и компилятор на обоих этапах вел себя будто брэйк относится к тому циклу, в шапке которого указан. Мне кажется это логичным: третья часть (step) шапки for-а должна выполняться после каждой итерации, таким образом вырубать цикл после первого прохода.
ПС. Изврашаться с языком приходится, чтобы соорудить макрос.