Note :       All the programs are tested under Turbo C/C++ compilers. 

It is assumed that,

Ø      Programs run under DOS environment,

Ø      The underlying machine is an x86 system,

Ø      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.    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.    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.    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.    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.    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 qis 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.

       

6.    main()

{

        extern int i;

        i=20;

printf("%d",i);

}

 

Answer: 

Linker Error : Undefined symbol '_i'

Explanation:

                extern storage class in the following declaration,

                                extern int i;

specifies to the compiler that the memory for i is allocated in some other program and that address will be given to the current program at the time of linking. But linker finds that no other variable of name i is available in any other program with memory space allocated for it. Hence a linker error has occurred .

 

7.    main()

{

        int i=-1,j=-1,k=0,l=2,m;

        m=i++&&j++&&k++||l++;

        printf("%d %d %d %d %d",i,j,k,l,m);

}

Answer:

                0 0 1 3 1

Explanation :

Logical operations always give a result of 1 or 0 . And also the logical AND (&&) operator has higher priority over the logical OR (||) operator. So the expression  ‘i++ && j++ && k++’ is executed first. The result of this expression is 0    (-1 && -1 && 0 = 0). Now the expression is 0 || 2 which evaluates to 1 (because OR operator always gives 1 except for ‘0 || 0’ combination- for which it gives 0). So the value of m is 1. The values of other variables are also incremented by 1.

 

8.    main()

{

        char *p;

        printf("%d %d ",sizeof(*p),sizeof(p));

}

 

Answer:

                1 2

Explanation:

The sizeof() operator gives the number of bytes taken by its operand. P is a character pointer, which needs one byte for storing its value (a character). Hence sizeof(*p) gives a value of 1. Since it needs two bytes to store the address of the character pointer sizeof(p) gives 2.

 

9.    main()

{

        int i=3;

        switch(i)

         {

            default:printf("zero");

            case 1: printf("one");

                   break;

           case 2:printf("two");

                  break;

          case 3: printf("three");

                  break;

          } 

}

Answer :

three

Explanation :

The default case can be placed anywhere inside the loop. It is executed only when all other cases doesn't match.

 

10.main()

{

          printf("%x",-1<<4);

}

Answer:

fff0

Explanation :

-1 is internally represented as all 1's. When left shifted four times the least significant 4 bits are filled with 0's.The %x format specifier specifies that the integer value be printed as a hexadecimal value.

Search site

© 2010 All rights reserved.