Wednesday, August 8, 2018

C Questions And Answers – 2018C8

There are many commonly asked questions regarding C programming language. Below are some collected such question-answer examples. The questions are usually related with 32-bit system, Turbo C IDE in windows or GCC under Linux environment [not always].

For more such examples, click C_Q&A label.

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

 

-------------------------------------------------------------------------------------------------

 

#define max 5

#define int arr1[max]

main()

{

typedef char arr2[max];

arr1 list={0,1,2,3,4};

arr2 name="name";

printf("%d %s",list[0],name);

}

 

Answer:

                   Compiler error (in the line arr1 list = {0,1,2,3,4})

 

Explanation:

arr2 is declared of type array of size 5 of characters. So it can be used to declare the variable name of the type arr2. But it is not the case of arr1. Hence an error.

 

Rule of Thumb:

#defines are used for textual replacement whereas typedefs are used for declaring new types.

 

-------------------------------------------------------------------------------------------------

 

int i=10;

main()

{

extern int i;

{

int i=20;

{

const volatile unsigned i=30;

printf("%d",i);

}

printf("%d",i);

}

printf("%d",i);

}

 

Answer:

                   30,20,10

 

Explanation:

'{' introduces new block and thus new scope. In the innermost block i is declared as,

const volatile unsigned which is a valid declaration. i is assumed of type int. So printf

prints 30. In the next block, i has value 20 and so printf prints 20.

In the outermost block, i is declared as extern, so no storage space is allocated for it. After compilation is over the linker resolves it to global variable i (since it is the only variable visible there). So it prints i's value as 10.

 

-------------------------------------------------------------------------------------------------

 

main()

{

int *j;

{

int i=10;

j=&i;

}

printf("%d",*j);

}

 

Answer:

                   10

 

Explanation:

The variable i is a block level variable and the visibility is inside that block only. But the lifetime of i is lifetime of the function so it lives upto the exit of main function. Since the i is still allocated space, *j prints the value stored in i since j points i.

 

-------------------------------------------------------------------------------------------------

 

main()

{

int i=-1;

-i;

printf("i = %d, -i = %d \n",i,-i);

}

 

Answer:

i = -1, -i = 1

 

Explanation:

-i is executed and this execution doesn't affect the value of i. In printf first you just print the value of i. After that the value of the expression -i = -(-1) is printed.

 

-------------------------------------------------------------------------------------------------

 

#include<stdio.h>

main()

{

const int i=4;

float j;

j = ++i;

printf("%d %f", i,++j);

}

 

Answer:

                   Compiler error

 

Explanation:

i is a constant. you cannot change the value of constant

 

-------------------------------------------------------------------------------------------------

 

#include<stdio.h>

main()

{

int a[2][2][2] = { {10,2,3,4}, {5,6,7,8} };

int *p,*q;

p=&a[2][2][2];

*q=***a;

printf("%d..%d",*p,*q);

}

 

Answer:

                   garbagevalue..1

 

Explanation:

p=&a[2][2][2] you declare only two 2D arrays. but you are trying to access the third 2D(which you are not declared) it will print garbage values. *q=***a starting address of a is assigned integer pointer. now q is pointing to starting address of a. if you print *q me Answer: it will print first element of 3D array.

 

-------------------------------------------------------------------------------------------------

 

#include<stdio.h>

main()

{

register i=5;

char j[]= "hello";

printf("%s %d",j,i);

}

 

Answer:

                   hello 5

 

Explanation:

if you declare i as register compiler will treat it as ordinary integer and it will take integer value. i value may be stored either in register or in memory.

 

-------------------------------------------------------------------------------------------------

 

main()

{

int i=5,j=6,z;

printf("%d",i+++j);

 

}

 

Answer:

                   11

 

Explanation:

the expression i+++j is treated as (i++ + j)

 

-------------------------------------------------------------------------------------------------

 

struct aaa{

struct aaa *prev;

int i;

struct aaa *next;

};

main()

{

struct aaa abc,def,ghi,jkl;

int x=100;

abc.i=0;abc.prev=&jkl;

abc.next=&def;

def.i=1;def.prev=&abc;def.next=&ghi;

ghi.i=2;ghi.prev=&def;

ghi.next=&jkl;

jkl.i=3;jkl.prev=&ghi;jkl.next=&abc;

x=abc.next->next->prev->next->i;

printf("%d",x);

}

 

Answer:

                   2

 

Explanation:

above all statements form a double circular linked list;

                   abc.next->next->prev->next->i

this one points to "ghi" node the value of at particular node is 2.

 

-------------------------------------------------------------------------------------------------

 

…till next post, bye-bye & take care.

No comments:

Post a Comment