C Tricky Programs

Note : All the programs are tested under Turbo C/C++ compilers. It is assumed that, Programs run under DOS environment. Program is compiled using Turbo C/C++ compiler. The program output may depend on the information based on this assumptions (for example sizeof(int) == 2 may be assumed).

Predict the output or error(s) for the following:

1. Look at the sample program and predict the output

void main()

{

            int  const * p=5;

            printf(“%d”,++(*p));

}

Answer:

                        Compiler error: Cannot modify a constant value.

 

Explanation:

p is a pointer to a “constant integer”. But we tried to change the value of the “constant integer”.

 

2. Look at the sample program and predict the output

main()

{

            char s[ ]=”man”;

            int i;

            for(i=0;s[ i ];i++)

            printf(“\n%c%c%c%c”,s[ i ],*(s+i),*(i+s),i[s]);

}

Answer:

mmmm

aaaa

nnnn

 

Explanation:

s[i], *(i+s), *(s+i), i[s] are all different ways of expressing the same idea. Generally  array name is the base address for that array. Here s is the base address. i is the index number/displacement from the base address. So, indirecting it with * is same as s[i]. i[s] may be surprising. But in the  case of  C  it is same as s[i].

 

3. Look at the sample program and predict the output

main()

{

            float me = 1.1;

            double you = 1.1;

            if(me==you)

printf(“I love U”);

else

                        printf(“I hate U”);

}

Answer:

I hate U

 

Explanation:

For floating point numbers (float, double, long double) the values cannot be predicted exactly. Depending on the number of bytes, the precession with of the value  represented varies. Float takes 4 bytes and long double takes 10 bytes. So float stores 0.9 with less precision than long double.

 

Rule of Thumb:

Never compare or at-least be cautious when using floating point numbers with relational operators(== , >, <, <=, >=,!= ) .

 

4. Look at the sample program and predict the output

main()

            {

            static int var = 5;

            printf(“%d “,var–);

            if(var)

                        main();

            }

Answer:

5 4 3 2 1

 

Explanation:

When static storage class is given, it is initialized once. The change in the value of a static variable is retained even between the function calls. Main is also treated like any other ordinary function, which can be called recursively.

 

5. Look at the sample program and predict the output

main()

{

             int c[ ]={2.8,3.4,4,6.7,5};

             int j,*p=c,*q=c;

             for(j=0;j<5;j++) {

                        printf(” %d “,*c);

                        ++q;     }

             for(j=0;j<5;j++){

printf(” %d “,*p);

++p;     }

}

 

Answer:

2 2 2 2 2 2 3 4 6 5

 

Explanation:

Initially pointer c is assigned to both p and q. In the first loop, since only q is incremented and not c , the value 2 will be printed 5 times. In second loop p itself is incremented. So the values 2 3 4 6 5 will be printed.