|
|
  |
Оператор GoTo, безусловный переход или правила хорошего тона |
|
|
|
Sep 30 2006, 04:24
|
Участник

Группа: Новичок
Сообщений: 20
Регистрация: 17-01-06
Пользователь №: 13 275

|
Спасибо высказавшимся, просто написал переход от двоичной в двоично-десятичную (для семисегментников), и вспомнил про гоуту...
|
|
|
|
|
Sep 30 2006, 06:10
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(_artem_ @ Sep 30 2006, 01:40)  Была какая то статья, с которой весь этот садомазоэстетический спор в мире програмистов начался, не помню только ее название. Началась это на моей памяти Виртом с обоснования теоретической базы "Паскаля" как попытки создать язык идеальный для толкования компилятором ну априори предполагаемый "удобным" для пользователя ввиду его однозначности. Для компилятора, спору нет, goto в большинстве случаев - проблема, ибо начисто ломает его все стандартные "домашние заготовки". Соответственно простые компиляторы давних времен генерили весьма поганый код. Компиляторы поумнели и стали нормально понимать удобные человеку конструкции, идеалисты от компиляции продолжают движение и дошли до "Оберона". На сегодняшний день причин не использовать в "C" goto в удобном месте нет.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Sep 30 2006, 09:43
|
Профессионал
    
Группа: Свой
Сообщений: 1 453
Регистрация: 23-08-05
Пользователь №: 7 886

|
Цитата(zltigo @ Sep 30 2006, 10:10)  На сегодняшний день причин не использовать в "C" goto в удобном месте нет. Хм.... Причина есть! И на сегодняшний день она ещё более актуальна! Дело в том, что сейчас серьёзный проект можно написать только работая в команде разработчиков. И для того, что бы в твоём коде можно было разобраться другому человеку, надо писать по общепринятым "правилам хорошего тона". Одним из правил является форматирование отступами вложенного кода (например тело цикла, условия - так проще найти глазами конец цикла и условия и т.д.). С использованием Goto такое форматирование осуществить в общем случае невозможно, что приводит полному мясу кода, который спустя некоторое время не только сторонний человек понять не сможет, но и даже сам разработчик. А компиляторы тут ни при чём, сейчас они умные. ИМХО любой логичный алгоритм можно изящно записать без Goto. Это как "любую мысль можно передать без мата".
|
|
|
|
|
Sep 30 2006, 10:04
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Petka @ Sep 30 2006, 12:43)  С использованием Goto такое форматирование осуществить в общем случае невозможно, что приводит полному мясу кода, который спустя некоторое время не только сторонний человек понять не сможет, но и даже сам разработчик. Если выражаться коротко, то это бред. Цитата ИМХО любой логичный алгоритм можно изящно записать без Goto. Это как "любую мысль можно передать без мата". Можно все, но не изящно. Ибо понятие изящно применимо к более-менее искуственно замкнутым системам. Там где на систему плотно влияют внешние непреодолимые обстоятельства там и требуются якобы "неизящные" выходы и не самые исключения, которые подтверждают правила. Причем попав в такую ситуацию я предпочитаю четко и ясно выразить свлю мысль, например словом "пи....ц", поятным каждому нормальному человеку а не "изящно" и муторно с жевать сопли для "литературной" передачи мысли.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Sep 30 2006, 12:20
|
Частый гость
 
Группа: Новичок
Сообщений: 173
Регистрация: 3-09-04
Из: Moscow
Пользователь №: 595

|
Цитата(zltigo @ Sep 30 2006, 14:04)  Цитата(Petka @ Sep 30 2006, 12:43)  С использованием Goto такое форматирование осуществить в общем случае невозможно, что приводит полному мясу кода, который спустя некоторое время не только сторонний человек понять не сможет, но и даже сам разработчик.
Если выражаться коротко, то это бред. А если не коротко ? Пока не видно Ваших аргументов. Ждём примера кода, который без GOTO хуже, нежели с GOTO. imho, максимум, что может дать GOTO - это сократить код на 2-3 строки в ущерб читабельности программы. Цитата(zltigo @ Sep 30 2006, 14:04)  Цитата Это как "любую мысль можно передать без мата".
Причем попав в такую ситуацию я предпочитаю четко и ясно выразить свлю мысль, например словом "пи....ц" Не уподобляйтесь тем, у кого "косноязычие компенсируется скудоумием". Поверьте - русский язык велик и могуч. Хотя в Ваших краях, наверное, с его изучением туговато.
|
|
|
|
|
Sep 30 2006, 12:52
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(CD_Eater @ Sep 30 2006, 15:20)  А если не коротко ? А не коротко, по поводу отцитированного ничего и не скажешь :-(. Цитата Хотя в Ваших краях, наверное, с его изучением туговато. Тем не менее, я полагаю, что достаточно хорошо им (как в прочем и "C" ) владею и вполне внятно выразил причины использования и присутствия goto во всех реальных языках программирования не смотря на многодесятилетние теоретические размышления о "вреде", "возможности обойтись" и мифической "читабельности". Цитата Поверьте - русский язык велик и могуч. И делает его могучим именно присутствие элементов живого языка, таких как обсуждаемый здесь goto, и выгодно отличает его от "легко читаемых" с выброшенными "ненужностями" искусственных языков, типа Эсперанто.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Sep 30 2006, 14:27
|
Участник

Группа: Новичок
Сообщений: 20
Регистрация: 17-01-06
Пользователь №: 13 275

|
Особо переделкой без goto не занимался, но кто что скажет: VAL=0; X=100; foR(I=0;I<=2;I++) { LABEL: TMP_P=TMP; TMP=TMP-X; if(TMP<0) { SEG[i]=VAL; VAL=0; TMP=TMP_P; X=X/10; } else { VAL=VAL++; goto LABEL; }
}
Смысл таков: есть заранее неизвестное значение (16р) в диапазоне 0-999 - TMP. Вывод на тройной индикатор SEG0-2. Идея:" Способ преобразования заключается в том, чтобы, вычитая из исходного числа число 100, сначала определить десятичную цифру десятков сотен. Затем находится цифра десятков последовательным вычитанием числа 10 и т. д. Вычитание каждый раз производится до получения отрицательной разности с подсчетом числа вычитаний. При переходе к определению каждого следующего десятичного разряда в регистрах исходного числа восстанавливается последняя положительная разность"
|
|
|
|
|
Sep 30 2006, 14:40
|
Профессионал
    
Группа: Свой
Сообщений: 1 453
Регистрация: 23-08-05
Пользователь №: 7 886

|
Цитата(zltigo @ Sep 30 2006, 14:04)  Цитата(Petka @ Sep 30 2006, 12:43)  С использованием Goto такое форматирование осуществить в общем случае невозможно, что приводит полному мясу кода, который спустя некоторое время не только сторонний человек понять не сможет, но и даже сам разработчик.
Если выражаться коротко, то это бред. Аргументы? В электронику я перешёл из "программистов". Могу позволить себе утверждать, что Вы не до конца освоили работу в команде, как и отличие языков высокого уровня от низкого. Недавно в форуме пробегала ссылка на "косметику для программистов". Советую ознакомится.
|
|
|
|
|
Sep 30 2006, 14:56
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(J_B @ Sep 30 2006, 17:27)  Смысл таков: Если не касаться прочих многочисленных, назовем - странностей, то просто вообще уберите две строки label: и goto label; и добавьте цикл с break; Если зачем-то кто-то пишет такое, то я начинаю понимать Petka :-)
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Sep 30 2006, 15:07
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Petka @ Sep 30 2006, 17:40)  Аргументы? Попробуйте преречитать написанное Вами: Цитата Одним из правил является форматирование отступами вложенного кода (например тело цикла, условия - так проще найти глазами конец цикла и условия и т.д.). С использованием Goto такое форматирование осуществить в общем случае невозможно.... Я искренне не понимаю какие аргументы от меня требуются :-((((
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Sep 30 2006, 15:45
|
    
Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731

|
Цитата(J_B @ Sep 30 2006, 18:27)  Особо переделкой без goto не занимался, но кто что скажет: Код VAL=0; X=100; for(I=0;I<=2;I++) { LABEL: TMP_P=TMP; TMP=TMP-X; if(TMP<0) { SEG[i]=VAL; VAL=0; TMP=TMP_P; X=X/10; } else { VAL=VAL++; goto LABEL; } } Смысл таков: есть заранее неизвестное значение (16р) в диапазоне 0-999 - TMP. Вывод на тройной индикатор SEG0-2. Идея:" Способ преобразования заключается в том, чтобы, вычитая из исходного числа число 100, сначала определить десятичную цифру десятков сотен. Затем находится цифра десятков последовательным вычитанием числа 10 и т. д. Вычитание каждый раз производится до получения отрицательной разности с подсчетом числа вычитаний. При переходе к определению каждого следующего десятичного разряда в регистрах исходного числа восстанавливается последняя положительная разность" Скажу только, что Код goto LABEL; здесь абсолютно бессмысленен, т.к. точно такой же по смыслу переход уже присутствует в силу организации цикла. По сути программы: если Вы хотели уйти от деления, Вам это таки не удалось. Сделайте хотя бы так: Код if(TMP<0) { SEG[i]=VAL; VAL=0; TMP=TMP_P; if(X==100) X=10; else if(X==10) X=1; else break; } А еще проще посмотреть сорцы для BCD преобразования. Бр-р-р. Не посмотрел на уловия цикла. Здесь и goto не поможет  .
|
|
|
|
|
Sep 30 2006, 16:02
|
    
Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731

|
Цитата(zltigo @ Sep 30 2006, 19:55)  Код seg[0] = tmp/100; seg[2] = tmp%10; tmp /= 10; seg[1] = tmp%10; Ну так не интересно  . Без выподвывертов-то  .
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|