简体   繁体   中英

Output of this simple C program

I'm an intermediate programmer of C++. I came across this code which prints number from 1-1000 without loop, not even recursion. And I've literally no idea how is this working. Can any please explain this code?

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

void function(int j)
{
    static void (*const ft[2])(int) = { function, exit };

    printf("%d\n", j);
    ft[j/1000](j + 1);
}

int main(int argc, char *argv[])
{
 function(1);
}

Just simple recursion:

static void (*const ft[2])(int) = { function, exit };

First a function pointer array is created with fpointers to function and exit , both taking an int .

Then ft[j/1000](j + 1); calls the function at element [j/1000] which is 0 as long as j is less than 1000, so function is called, otherwise exit is called.

This is obviously recursive, it contains a 2-element array of function pointers and calls either itself ( ft[0] is function ) or exit() to exit the program.

This line:

ft[j/1000](j + 1);

is a recursive call for as long as j/1000 evaluates to 0 . It can be rewritten as:

if(j < 1000)
  function(j + 1);
else
  exit(j + 1);

Inside the function function there is declared a pointer to the function itself as an element of an array

static void (*const ft[2])(int) = { function, exit };
                                    ^^^^^^^^

So inside the function these calls

f( j + 1 );

and

ft[0]( j + 1 );

are equivalent.

The expression

j / 1000

is always equal to 0 due to the integer arithmetic until j is equal to 1000 .

Thus the function recursively calls itself 1000 times. When j is equal to 1000 then the function exit is called because ft[1] is pointer to exit .

The program can be written much simpler and clear. For example

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

void function(int j)
{
    printf("%d\n", j);
    if ( j / 1000 == 0 ) f( j + 1 );
}

int main(int argc, char *argv[])
{
    function( 1 );
}

The only difference is that in the original program there is called exit with argument 1001 while this program successfully exits with argument 0.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM