Форум
О работе
Тема
Как правильно задавать вопросы
B
I
abc
U
X
3
X
3
H1
H2
H3
H4
H5
H6
Asm
C/C++
C#
Erlang
Haskell
IDL
Java
Lisp
MSIL
Nemerle
ObjC
OCaml
Pascal
Perl
PHP
Prolog
Python
Ruby
Rust
SQL
VB
Здравствуйте, karbofos42, Вы писали: K>Здравствуйте, fk0, Вы писали: fk0>> НЕТ, ещё раз: цикл в распространённых языках C/C++ уничтожает и создаёт заново все объекты fk0>>созданные в теле цикла. Это ПРИНЦИПИАЛЬНОЕ свойство цикла. Для C++ программистов оно означает, fk0>>что "for (auto& x : MakeTempObject())" не будет работать (вроде как будет пофикшено в C++23 для fk0>>этого частного случая), для C-программистов означает, что переменные объявленные в теле цикла fk0>>не обязаны сохранять свои значения (и адреса) в каждой новой итерации. K>Ну, вот код на C++: K>[ccode] K>for (int i = 0; i < 10; ++i) K>{ K> A *arr = new A(); K>} K>[/ccode] K>цикл каждую итерацию будет удалять созданный объект класса A или всё же память утечёт и нет никакой гарантии про все объекты? fk0>> Я знаю ассемблер. Но цикл и вызов функции -- это не только переход. fk0>>Переход лишь как средство реализации. И оно может оказаться совершенно другим. fk0>>Цикл может быть развёрнут, может быть tail call оптимизация, функция может быть fk0>>заинлайнена, да что угодно ещё... K>Но технически все эти функции и циклы преобразуются в банальные goto или что-то подобное, а вся эта инициализация переменных, очистка стека - это добавляет компилятор. fk0>> Но никто не мешает порождать код с UB и молча молчать. И получать неинициализированные fk0>>переменные например. При прыжке вперёд через инициализацию переменной (C++ запрещает) fk0>>или прыжке назад в середину тела цикла в котором декларировались переменные. K>Вопрос к создателям языка и компиляторов к нему. Никто им не мешает обойтись без UB fk0>> Нет. Условие прерывания цикла может переехать в оператор for, например. K>В простейшем случае в итоге получим некрасивую запись и лишнюю проверку в конце, где будем выяснять причины попадания в строку K>(коллекция кончилась и ничего нужного не нашлось или же наткнулись на искомый элемент и нужно его вернуть). K>На деле же условие выхода из цикла будет с предварительными расчётами и в for не влезет. K>Можно конечно всякого нагородить, но не понятно зачем. K>Там же и читабельность кода снизится и лишние операции добавятся. fk0>> И сразу вопрос, что делать компилятору с переменными созданными в цикле? fk0>>Деструктор для них же надо вызывать? K>примерно то же самое, что компилятор делает при break fk0>>И становится goto очень неочевидным оператором, fk0>>с очень неявным control flow... K>у исключений с try/catch не проще и потенциальных проблем от них не меньше, но народ как-то живёт. K>Ну, сложно с goto - пусть дадут оператор для выхода из всех циклов. K>Бывают ситуации типа: K>[ccode] K>int value = 0; // стандартное значение K>for (int i = 0; i < 10; ++i) K>{ K> for (int j = i + 1; j < 11; ++j) K> { K> for (int k = j + 1; k < 12; ++k) K> { K> if (...) K> value = ...; // меняем значение на расчётное K> break; // тут хочется выйти из всех 3-х циклов K> } K> } K>} K>// Дальше используем value вне зависимости от того какое значение (стандартное или расчётное) K>[/ccode] K>break из одного цикла почему-то не является проблемой для создателей языков. K>Как и return из любой строки. K>Не понимаю что не так с break из пары вложенных циклов и чем это принципиально отличается. K>Можно конечно всё это в единственный while переписать или ещё чего намудрить, но читаемость кода снизится, K>а по факту будет выполняться примерно то же самое, что можно с goto написать и не терять в читаемости. K>И в итоге на практике не понятно что выйдет надёжнее в поддержке: K>странно написанный и непонятный код по всем правилам структурного программирования или лаконичный код с сомнительным goto.
Теги:
Введите теги разделенные пробелами. Обрамляйте в кавычки словосочетания с пробелами внутри, например:
"Visual Studio" .NET
Имя, пароль:
Загрузить
Нравится наш сайт?
Помогите его развитию!
Отключить смайлики
Получать ответы по e-mail
Проверить правописание
Параметры проверки …