Это не самый симпатичный способ сделать это, но по-моему, это - лучший способ.
def loop():
while True:
#snip: print out current state
while True:
ok = get_input("Is this ok? (y/n)")
if ok == "y" or ok == "Y": return
if ok == "n" or ok == "N": break
#do more processing with menus and stuff
я вполне уверен, Вы могли разработать что-то с помощью рекурсии здесь также, но я не знаю, является ли это хорошим вариантом для Вас.
5.3.4 в стандарте C ++:
6 Каждое константное выражение в direct-new-declarator должно быть интегральной константой выражение (5.19) и получим строго положительное значение. Выражение в direct-new-declarator должно иметь целочисленный или перечисляемый тип (3.9.1) с неотрицательным значением ...
7 Когда значение выражение в direct-new-declarator равно нулю, функция распределения вызывается для выделения массива без элементов.
Итак, ваш код выделяет массив, который ведет себя в каждом уважать, как и любой другой массив T (можно удалить с помощью delete [], переданного в качестве параметра, возможно, других вещей). Однако у него нет доступных индексов (то есть чтение или запись ptr [0] приводит к неопределенному поведению).
В этом контексте различие между константным выражением и выражением заключается не в том, является ли фактическое выражение постоянной времени компиляции (которое, очевидно, равно 0), а в том, определяет ли оно «последнее» измерение многомерного массива. Синтаксис определен в 5.3.4: 1.
Разрешено (5.3.4 / 6). Его результатом является пустой массив, поэтому возвращаемое значение является указателем за массивом.
Да, это допустимое поведение, и ptr будет действительным. Конструкция переносима для всех компиляторов C ++, которые соответствуют стандарту C ++. Он полезен тем, что позволяет вам писать код, который не требует специального инструментария для обработки случая, когда количество элементов равно нулю.
Однако, как всегда, вам будет удобнее использовать std: : вектор (который также может иметь нулевой размер) вместо массива.
Связанный вопрос: Что должен возвращать malloc (0)?
И из некоторых документов C99 поведение malloc (0) определяется реализацией:
Независимо от того, являются ли calloc, malloc и функции realloc возвращают нуль указатель или указатель на выделенный объект, когда запрошенный размер равен нулю (7.20.3).
Либо нулевой указатель, либо уникальный указатель, который можно передать в free () возвращается.
См. справочную страницу malloc (3C).
Конечно, вы спрашиваете о C ++, но информация о malloc в любом случае может пригодиться.