Ну не скажи. Во-первых кроме return тут большая компания: continue, break, throw... А во-вторых для этих операторов не требуется метка, точка выхода для них - более очевидна, чем для goto. Поэтому они считаются более-менее "структурными". ЗЫ Да и еще yield, как же ж без него, родимого, структурного нашего....
да goto приближает нас к низкоуровневому программированию ... ведь никто не пытается сказать ничего против джампов в ассемблере ... и поскольку у Си С++ положение аморфное .... то GOTO живет там как засланец мышыных кодов! давненько было помню как z0mbie в своей теории недектируемости вируса (делал попытки на Goto выстроить матрицу исполнения, которая по его мнению могла завести любую эвристику в ступор) ... делал он именно на GOTO ... поэтому GOTO живет и будет жить ... НО Я ГОВОРЮ НЕ О ВЕЩАХ УПРОЩАЮЩИХ ПОНИМАНИЕ, а наоборот 8)))) , вообще вопрос риторический должен ли антивирус понимать код вируса!
Code: public TcpClient Connect(IPEndPoint host) { TcpClient client = new TcpClient(); for(int maxTryCount = 5; maxTryCount; maxTryCount--) { try { client.Connect(host); return client; } catch (SocketException) {} } throw; }
Да, и в книгах об этом пишут, а ты не думал почему ? Может быть потому что многолетний опыт подсказывает что и правда лучше отказаться от goto ? Если бы было все так просто, то не создавали б другие циклы ( do..while, for, whlie ) Да, может быть именно в твоей ситуации goto и смотрится лучше, но в других случаях, как правило, это лишь усложняет программу, особенно если ее пишут "неопытные" программисты, которые скачут с goto по программе вдоль и поперек. Поэтому, используй goto только тогда когда это НЕ ЗАПУТАЕТ код программы. Во
циклы могут выходить стандартными средствами не делая скачков и не делая ненужных проходов.... просто обычно люди сравнение в for(....;X<Y;....) делают одно а досточно описать флаг выхода и вы выйдите из любого количества циклов без лишних проходов.... for(....,ex=0;X<Y && ex==0;....) Code: for(....,ex=0;X<Y && ex==0;....) for(....;K<L && ex==0;....) for(....;M<N && ex==0;....) .... for(....;F<G && ex==0;....) if(BLABLA==TUTU) ex=1;
Retimiled, вообще то глубокой вложенности нужно избегать - с помощью выделения кода в методы\функции, ибо глубоко вложенные циклы нечитабельное говно с любой стороны - что с goto, что с флагами, что с break/continue.
2 Ra$cal да .... если не заботишься об быстродействии и не отсчитываешь такты на PUSHA POPA , то конечно нужно оформлять в виде функций а как ты растащишь вот такой код Code: for(....,ex=0;X<Y && ex<10;....) for(....;K<L && ex<9;....) for(....;M<N && ex<8;....) .... for(....;F<G && ex<1;....) if(BLABLA==TUTU) ex=8; // то есть я могу уйти в рамках цикла на люой уровень вложенности 8))
А хз ) Синтаксиса не помню уже ) Но там переписать не сложно без goto с меньшими затратами =) Не дотнетчик я - импровизировал )
В целом да, так и есть. Но опять же есть специфические случаи, когда это очень геморно. В основном из-за того что нужно передавать кучу параметров в такую функцию. Да и семантика такой функции не всегда понятна (К примеру, при перемножении матриц нужно делать три вложенных цикла, если два из них вынести в функцию, то как назвать такую функцию? func1() ? ).
Я бы вынес проверку одной матрицы на наличие нуля в отдельную функцию и делал бы return true если бы встретился хотя бы один ноль. А общий цикл оформил бы примерно так (псевдокод): Code: public boolean checkMatrix(Matrix m) { for(List list: m) { if(!checkForZeroValue(list)) return false; } return true; } private boolean checkForZeroValue(List list) { for(Item i: list) if(встретился_ноль) return true; return false; } Читабельность имхо выше, чем всякие разные метки искать. Ну а в целом, я иногда использую continue; но никогда не приходилось использовать goto.
помню-помню когда-то в школе использовал его) но это была только одна задача) а прошло уже много лет) п.с. о вкусах не спорят) если тебе так удобнее почемубы и нет) в бою все средства...
В данном случае о вкусах спорят, т.к.: 1) Этот код будет разбирать не только автор 2) Возможно даже через несколько лет.
Псевдокод это конечно хоршо и кошерно, но реальные программы пишутся не на псевдокоде. Я же привожу конкретные примеры, в котором метка - самое простое и наглядное решение. Странно, у меня continue чуть ли не в каждом втором цикле. Но в целом точка зрения ясна.
Моё решение более наглядно, не запутаешься во вложенных циклах, и не придётся смотреть по коду, где находится метка, на которую ты скачешь. Да и псевдокод очень даже приближен к реальности