Другие языки программирования и технологии

Те кто против goto просто не имели дело с серьёзными сложными алгоритмами?

Дмитрий Аминов
Дмитрий Аминов
30 065
Имели.
Читать такие проги тяжко.
Вот прога на ком1 - уже 10 тысяч строк. И там будут, скажем, 20 гоуту. Вы как листинг будете смотреть?
Я уж молчу о падении эффективности исполняемого файла.
Muhit Imashev
Muhit Imashev
37 994
Лучший ответ
Необходимость в goto есть следствие своеобразия синтаксиса. Использование такой конструкции означает лень "городить огород" из дополнительных строк кода. "сложные алгоритмы" с goto лишь результат лености автора.


В Пайтона при уровне вложенности 3/4 уже потребность оформить функционал в def и трава не расти. Просто потому, что длинные строки перестают быть читаемыми
А с другой стороны, компилятор не в состоянии произвести оптимизацию кода, как и ассемблеровских вставок
Так что подобного рода алгоритмы некрасивы, а потому не оптимальны
Filip 26
Filip 26
65 707
Лоці Міца "компилятор не в состоянии произвести оптимизацию кода"
Для этого существуют программисты.
Код пишется для людей, а не для машин, а твои goto его усложняют. Особенно в сложных алгоритмах.
Эльдар Сеферов
Эльдар Сеферов
64 399
если брать высокоуровневые яп, то там оно не нужно априори, в визуальном редакторе типа flowcode до 6 версии есть места, где без него никак.. в асме - без него никак
Рома Ясель
Рома Ясель
55 981
Некоторые вещи с goto получаются проще, да ещё, пожалуй, элегантнее. Например, выход из внутренних циклов, как вон при решении трансцендентного уравнения:
#include <vector>
#include <cmath>
#include <iomanip>
#include <iostream>
using namespace std;
double f(double x)
{ return log(x) - 1 / x; }
int main()
{
int i, j, k, l; double x, h = 1e-4, d = 2 * h;
vector <double> X; string digit[10] =
{"₀", "₁", "₂", "₃", "₄", "₅", "₆", "₇", "₈", "₉"},
blue = "\033[34m", green = "\033[32m",
yellow = "\033[33m", biruse = "\033[36m",
magenta = "\033[35m", red = "\033[31m";
vector <unsigned> chislo; cout << fixed;
for (i = 0; i < 27; i++) cout << green << '=';
while (true) { cout << blue << "\nX₀: " << red;
cin >> x; X.push_back(x); for (i = 0; i < 27; i++)
cout << yellow << "—"; cout << endl; for (i = 1;; i++)
{ x -= f(x) * d / (f(x + h) - f(x - h));
for (j = X.size() - 1; j >= 0; j--)
if (x == X[j]) goto end;
X.push_back(x); k = i; l = 0;
while (k) { chislo.push_back(k % 10);
k /= 10; l++; } cout << biruse << 'X';
for (j = chislo.size() - 1; j >= 0; j--)
cout << digit[chislo[j]];
cout << magenta << setprecision(16)
<< setw(26 - l) << x << endl; chislo.clear(); }
end: X.clear(); for (i = 0; i < 27; i++)
cout << green << '='; }
}
Трансцендентные уравнения типа cos(x)=x, ln(x)+sin(x)=0 и т.д. почему-то очень часто любят задавать некоторые преподаватели программирования.
Ещё в ЯВУ есть где-то примерно пара случаев, когда оператор goto действительно полезен, но вся его полезность на этом заканчивается...
Дело вкуса и мастерства. Проверять код да еще и с метками достаточно тяжело. Другое дело, что бывают случаи, когда без goto не обойтись.
нет
Имели
Вадим Салтыков
Вадим Салтыков
25 006