Я думаю, что существует много примеров поломок обратной совместимости. Многие языки, которые сделали это, были или маленькими или вымерли по пути.
Много примеров этого включенного переименования языка.
Алгол 60 и Алгол 68 так отличались, что встречи по Алголу 68 разбились на фракции. Алгол 68 фракций, фракция Паскаля и фракция PL/I.
Паскаль Wirth, превращенный в Modula-3. Это было очень похоже на Паскаль - очень похожий синтаксис и семантику - но несколько новых возможностей. Это был действительно Паскаль 2 без обратной совместимости?
Lisp к вещи Схемы включил переименовывание.
, Если Вы разыскиваете сканирование старого язык программирования B руководство, Вы будете видеть, что эволюция к C выглядит довольно возрастающей - не радикальный - но это действительно повреждало совместимость.
Фортран существовал во многих формах. Я не знаю наверняка, но я думаю, что Фортран Digital 90 для VAX/VMS не был абсолютно совместим с древними программами IV Фортрана.
RPG прошел главные перевороты - я думаю, что существует действительно два несовместимых языка, названные RPG.
Нижняя строка я думаю, что взгляды и изучение неизбежно. У Вас есть три ответа на изучение ограничений языка.
Изобретают новый язык, это является совершенно несовместимым.
Возрастающее изменение, пока Вы не вынуждены изобрести новый язык.
совместимость Повреждения управляемым, вдумчивым способом.
я думаю, что № 1 и № 2 являются оба путями труса. Зажимание старого легче, чем попытка сохранить его. Сохранение каждой детальной функции (неважно, как плохо) является большой работой, частью его минимального значения.
Коммерческие предприятия выбирают трусливые подходы от имени "нового маркетинга" или "сохранение наших существующих клиентов". Вот почему коммерческие предприятия программного обеспечения не являются рассадниками инноваций.
я думаю, что [только 1 123] проекты с открытым исходным кодом могут быть инновациями объятия в способе, которым сообщество Python занимается этим изменением.
Нет, вы не вызовете утечки памяти. Использование goto
не означает «неправильный выход из цикла». Это просто обычно не рекомендуется с точки зрения структуры кода.
Кроме того, когда вы покидаете цикл, локальные переменные выходят из области видимости и выталкиваются из стека (то есть очищаются) в процессе.
Переменные стека (autos, not autobots) не являются «дырявыми», как переменные, выделенные с помощью new () или malloc ().
Что касается «уродства» gotos, это просто догматический. Прочтите Кнута, он был так же гениален, как Дейкстра. http://pplab.snu.ac.kr/courses/adv_pl05/papers/p261-knuth.pdf Избегайте программирования на основе макаронных изделий, но осторожное использование не превратится в спагетти.
Dijkstra didn ' Мне они нравятся, ПОТОМУ, что большая часть того, что вы можете делать с помощью gotos, может быть выполнено с помощью других методов структурированного программирования и использует меньше кода, что делает другой структурированный менее подверженным ошибкам.
Поймите, что gotos не должны быть вашим первым решением, и не Не старайтесь их использовать, но если это имеет смысл, не подчиняйтесь догматическим мобам-ленчам.
Переменные стека определяются (и выделяются) в тот момент, когда вы входите в функцию, и неявно удаляются, когда вы покидаете функцию (поскольку вся запись стека вызовов удаляется). Никакие подпрыгивания внутри функции не могут вызвать хаоса с памятью, которая была выделена все время. Независимо от того, какой путь выполнения вы выберете через код, запись стека появится, когда управление вернется к вызывающей функции, и память будет освобождена.
Остальные ответы верны .... однако, если вам нужно вложить циклы по-другому, я бы поставил под вопрос дизайн, в котором они были помещены. Разделение этой логики на отдельные функции было бы лучшим способом решить такую проблему.
Billy3
Нет. Возможна утечка только динамически выделяемой памяти.
Нет, любые автоматические переменные в ваших циклах не вызовут утечек программирования, если вы прервете цикл с помощью оператора goto.
Нет. Локальные переменные не нужно очищать отдельно. Когда стек появится, все локальные переменные исчезнут вместе с ним.
Goto - это не всегда плохо, но в вашем случае вам, вероятно, не следует использовать goto.
См. Примеры правильного использования goto здесь и здесь .
Если вы перейдете к метке, которая находится за пределами области видимости, ваш объект в стеке будет освобожден.
Пример:
#include <iostream>
using namespace std;
class A
{
public:
~A()
{
cout<<"A destructor"<<endl;
}
};
int main(int argc, char**argv)
{
{
A a;
cout<<"Inside scope"<<endl;
goto l;
cout<<"After l goto"<<endl;
}
cout<<"Outside of scope before l label"<<endl;
l:
cout<<"After l label"<<endl;
return 0;
}
Будет напечатано:
Внутри области
Деструктор
После l label
Нет, не будете.
Однако убедитесь, что все внешние ресурсы освобождены должным образом. Например, если вы открыли файл, можно было бы перескочить туда, где он обычно был бы закрыт.