В чем причина того, что некоторые люди используют инструкцию GOTO в объективном C?

У меня нет опыта в разработке ObjectiveC (IOS), но я видел слишком много кодов для любопытства и нашел некоторых людей, использующих инструкцию GOTO ( JsonKit Library , некоторые игры с кодами и т. Д.), Даже исходный код Apple, как известно, использует это ( You см. здесь ).

Как я узнал за всю свою академическую жизнь, использование GOTO – очень плохая закономерность развития, и этого нужно избегать, так почему же это «commom» pratice в развитии IOS, есть ли какая-то особая причина?

Solutions Collecting From Web of "В чем причина того, что некоторые люди используют инструкцию GOTO в объективном C?"

Хороший стиль программирования позволяет использовать goto break , continue и return вместо утверждения goto когда это возможно. Однако, поскольку оператор break выходит из одного уровня цикла, вам может потребоваться использовать инструкцию goto для выхода из глубоко вложенного цикла.

* Источник – Microsoft

Еще один пример из Блога

Мой опыт

Академик хорош и хорош, но, в реальном, практическом плохом мире, может случиться так, что вы должны выйти из 2 или 3 вложенных циклов в некоторых условиях.

Да, вы могли бы использовать три или две логические переменные, но почему бы не использовать быстрый, старый простой goto?

Если вы хотите, я могу опубликовать фрагмент кода, в котором я использовал goto.

 for( int nITap = 0; nITap < m_nNumPercorsi; nITap++ ) { // .. blastuff for( int nJTap = 0; nJTap < m_aPercorsi[nITap].m_nNumTappe - 1; nJTap++ ) { // ..yet bla stuff for( nIndAd = 0; nIndAd < m_aNodi[nIndNodCor]->m_nNumNodiAd; nIndAd++ ) if( m_aNodi[nIndNodSuc] == m_aNodi[nIndNodCor]->m_aNodiAdiacenti[nIndAd]->m_pNodoP2D ) break; for( nICor = 0; nICor < m_aNodi[nIndNodCor]->m_aIndSeg.GetCount(); nICor++ ) { for( nJCor = 0; nJCor < m_aNodi[nIndNodSuc]->m_aIndSeg.GetCount(); nJCor++ ) { if( m_aNodi[nIndNodCor]->m_aIndSeg[nICor] == m_aNodi[nIndNodSuc]->m_aIndSeg[nJCor] ) { nIndSpez = m_aNodi[nIndNodCor]->m_aIndSeg[nICor]; goto L_SegmentoTrovato; } } } L_SegmentoTrovato: aTmp.Add( nIndSpez );