Петля без для, в то время как или goto

В Windows можно использовать структурированную обработку исключений в C, чтобы написать псевдопетлю, которая печатает все числа от 1 до 1000 как это:

int n = 0;
__try {
    *(int *)0 = 0;
}
__except(printf("%i\n", ++n), n < 1000 ? -1 : 1) {
}

Интересно, есть ли также другие пути в C/C++, чтобы создать петлю, которая не тривиальна, чтобы обнаружить, если вы ищете код обычные подозрительные ключевые слова для , в то время как и goto .

2
nl ja de
@ft1: можно использовать ассемблерный код, как обозначено в следующем вопросе stackoverflow.com/questions/14523333/…
добавлено автор MOHAMED, источник
@Damon хороший
добавлено автор GOTO 0, источник
Действительно setjmp / longjmp количество? Или рекурсия... 1000 хорошо в диапазоне какой судороги на стеке:-),
добавлено автор Damon, источник
Простое #define для петли защитит от простого захвата для ключевого слова. Конечно, это won' t быть эффективным против кого-либо с IQ выше, чем 20, но ни один не будет ваш __ попытка / __ кроме.
добавлено автор Jerry Coffin, источник
Вызовы функции (рекурсия) или любой механизм управления потоками могут использоваться, чтобы сделать это.
добавлено автор Seth Carnegie, источник
У C++ есть станд.:: for_each
добавлено автор lethal-guitar, источник

1 ответы

В C++ простая лямбда может сделать это:

std::function print = [&](int from, int to)
{
    std::cout << from << " ";
    if ( from < to ) print(++from, to);
};

print(1, 1000);

Это напечатает все целые числа из 1 к 1000 . И это не использует для , в то время как или goto .

2
добавлено
@ft1: Для Настоящих проблем этот тип рекурсии прекрасен.
добавлено автор Nawaz, источник
@ft1: BTW, почему вы хотите знать общие решения для таких непрактичных проблем? don' t тратят впустую ваше время на такие вопросы. хорошо, когда вы делаете это для забавной пользы, но don' t заходят слишком далеко с ним.
добавлено автор Nawaz, источник
@ft1: даже это - пример, который демонстрирует основную идею, которая может быть сделана , чтобы работать на любой размер входа, как я сказал в своем предыдущем комментарии.
добавлено автор Nawaz, источник
@ft1: Вы сказали 1 к 1000 . я думаю , он не вызовет переполнение стека для этого как он doesn' t потребляют слишком много стековой памяти. BTW, это - основная идея, которая может быть сделана , чтобы работать на любой размер входа.
добавлено автор Nawaz, источник
@DanielFischer, который можно написать петле, чтобы образовать петли, но вы найдете петлю, если вы будете искать петлю?
добавлено автор GOTO 0, источник
@DanielFischer пункт очевиден, если вы думаете об огромных усилиях, которые современные языки приложили, чтобы предотвратить программирование спагетти, упростите повторения и т.д.
добавлено автор GOTO 0, источник
@Nawaz никогда не говорил обратное. Никто не может здесь понять пункт моего вопроса?
добавлено автор GOTO 0, источник
@CatPlusPlus не действительно, как я уже сказал, этот тип рекурсии, может вызвать переполнение стека, потому что новый стековый фрейм создается, прежде чем текущий перезагружается.
добавлено автор GOTO 0, источник
@DanielFischer действительно, который мог быть случаем практического применения.
добавлено автор GOTO 0, источник
@Nawaz, который был просто примером, что I' d нравится знать, то, если есть другие общие решения
добавлено автор GOTO 0, источник
@R.MartinhoFernandes практически, это вызвало бы переполнение стека для слишком многих повторений, тогда как петля не делает
добавлено автор GOTO 0, источник
спасибо, но это использует рекурсию, it' s не то же самое как петля
добавлено автор GOTO 0, источник
@ft1: WTF вы курите? Хвостовая рекурсия точно эквивалентна петле и стековым фреймам повторных использований.
добавлено автор Puppy, источник
@ft1, почему нет. Необходимо определить "петлю", тогда. (IOW, спасибо, но ваше решение использует SEH, it' s не то же самое как петля)
добавлено автор R. Martinho Fernandes, источник
@ft1, Что вы имеете в виду? Если код прилично написан, держа для для и , в то время как (и при некоторых обстоятельствах goto ) найдет петли. Вы пытаетесь узнать, в каких путях злорадный кодер мог запутать петли, чтобы узнать, что еще искать?
добавлено автор Daniel Fischer, источник
@ft1, Возможно, если вы объяснили идею. В данный момент, it' s просто забава, но не важный, вопрос.
добавлено автор Daniel Fischer, источник
@ft1 I don' t видят пункт, , почему не только пишут петлю, чтобы образовать петли?
добавлено автор Daniel Fischer, источник
@ft1 It' s настолько совсем не "практичный", как можно добраться.
добавлено автор Cat Plus Plus, источник
@ft1: Да, действительно. Хвостовая рекурсия абсолютно эквивалентна и может быть тривиально преобразована в постоянно-космическую петлю, и все современные компиляторы C++ делают это.
добавлено автор Cat Plus Plus, источник
Хвостовая рекурсия @ft1 эквивалентна петле.
добавлено автор Cat Plus Plus, источник
pro.cxx
pro.cxx
3 049 участник(ов)

C/C++ chat 0. Простые вопросы, лабы и о IDE — в чат новичков @supapro 1. Не хамим, не переходим на личности, не вбрасываем утверждения без доказательств 2. No Ads, offtop, flood Объявления о вакансиях и евенты - в лс @AlexFails https://t.me/ProCxx/259155

supapro.cxx
supapro.cxx
1 925 участник(ов)

Чат для тех, кто немного знает C++, простые вопросы по реализации, синтаксису и ide – сюда, а для другого есть: /Главный чат по серьезным вопросам — @ProCxx /Чат по обсуждению всего — @fludpac

C++ Russia
C++ Russia
384 участник(ов)

Сообщество разработчиков C++ в Telegram.

cxx.Дискуссионная
cxx.Дискуссионная
298 участник(ов)

это не двач, общайтесь вежливо; разговор на почти любые темы; Не согласны с баном? В лс @AlexFails, @ivario

C++ для маленьких и тупых
C++ для маленьких и тупых
105 участник(ов)

Лоу левел (по среднему IQ участников) чатик ExtremeCode @extremecode Флудилка @extremecode_rest