Подтвердить что ты не робот

Печать с 1 по 1000 без использования цикла

Я вижу вопрос о контексте программирования С++, я проверяю решение, и один из моих друзей дает мне этот код, его работы идеально подходят, но я не могу понять его логику, а также то, как она работает. я спросил его об этом, но он также не знает, как работает программа, я думаю, что он также принимает это решение откуда-то. Любой может объяснить логику, стоящую за этим, я имею в виду в строке   (&main + (&exit - &main)*(j/1000))(j+1);?

#include <stdio.h>
#include <stdlib.h>

void main(int j) {
  printf("%d\n", j);
  (&main + (&exit - &main)*(j/1000))(j+1);
}

Заранее спасибо

4b9b3361

Ответ 1

Он работает следующим образом:

Выполняет разделение int j/1000, которое будет возвращать 0 всегда, а j меньше, чем 1000. Таким образом, операция указателя выглядит следующим образом:

&main + 0 = &main, for j < 1000.

Затем он вызывает результирующую функцию, указанную операциями указателя, проходящими как параметр j+1. Пока j меньше, чем 1000, он будет вызывать main рекурсивно с параметром, который больше, чем предыдущий шаг.

Когда значение j достигает 1000, то целочисленное деление j/1000 равно 1, а операция указателя приводит к следующему:

&main + &exit - &main = &exit.

Затем он вызывает функцию exit, которая завершает выполнение программы.

Ответ 2

Я иду с объяснением, которое уже было дано, но было бы легче понять, если написано ниже:

void main(int j) {
   if(j == 1001)
      return;
   else
   {   
      printf("%d\n", j); 
      main(j+1);
   }   
}

Вышеприведенный код выполняет то же самое, что и уже написанный код.