Печать с 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);
}
Заранее спасибо
Ответы
Ответ 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);
}
}
Вышеприведенный код выполняет то же самое, что и уже написанный код.