A Few "C Puzzles"

Thanks to Alan Feuer, "The C Puzzle Book"

What does the following program print? Assume PRINT prints the argument and a return.

<<<< First File >>>>

int a[] = { 0, 1, 2, 3, 4 };

void main(void) {

    int i, *p;

    for (i = 0; i <= 4; i++)
        PRINT( a[i] );

    for (p = &a[0]; p <= &a[4]; p++)
        PRINT(*p);

    for (p = &a[0], i = 1; i <= 5; i++)
        PRINT(p[i]);

    for (p = a, i = 0; p + i <= a + 4; p++, i++)
        PRINT(*(p + i));

    for (p = a + 4; p >= a; p--)
        PRINT(*p);

    for (p = a + 4, i = 0; i <= 4; i++)
        PRINT(p[-i]);

    for (p = a + 4; p >= a; p--)
        PRINT(a[p - a]);

}