Прежде чем читать оставшуюся часть этого ответа, прочтите « Перейти к заявлению, которое считается вредным» . Если вы не хотите читать его полностью, вот что я считаю ключевым:
Необузданное использование оператора go to немедленно приводит к тому, что становится очень трудно найти значимый набор координат для описания хода процесса.
Или, перефразируя, проблема gotoв том, что программа может прибыть в середину блока кода, при этом программист не понимает состояние программы в этот момент. Стандартные блочно-ориентированные конструкции предназначены для четкого разграничения переходов между состояниями, обозначенногоbreak предназначен для перевода программы в определенное известное состояние (за пределами содержащего помеченный блок).
В реальной императивной программе состояние четко не очерчено границами блоков, поэтому сомнительно, что помеченное break- хорошая идея. Если блок меняет состояние, видимое снаружи блока, и есть несколько точек для выхода из блока, то помеченный breakэквивалентен примитивуgoto . Единственное отличие состоит в том, что вместо того, чтобы попасть в середину блока с неопределенным состоянием, вы начинаете новый блок с неопределенным состоянием.
В общем, я считаю, что это breakопасно. На мой взгляд, это признак того, что блок следует преобразовать в функцию с ограниченным доступом к охватывающей области.
Однако этот пример кода явно был продуктом генератора синтаксического анализатора (OP прокомментировал, что это исходный код Xerces). А генераторы парсеров (или генераторы кода в целом) часто позволяют себе вольность с кодом, который они генерируют, потому что они прекрасно знают состояние, и людям не нужно его понимать.
label913определяется?