Tuesday, August 3, 2010

C Question Set 2-14


  1. main(){

int i=5,j=10;


i=i&=j&&10;


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


}


Answer:


1 10


Explanation:


The expression can be written as i=(i&=(j&&10)); The inner expression (j&&10) evaluates to 1 because j==10. i is 5. i = 5&1 is 1. Hence the result.


 


  1. main(){

int i=4,j=7;


j = j || i++ && printf("YOU CAN");


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


}


Answer:


4 1


Explanation:


The boolean expression needs to be evaluated only till the truth value of the expression is not known. j is not equal to zero itself means that the expression’s truth value is 1. Because it is followed by || and true || (anything) => true where (anything) will not be evaluated. So the remaining expression is not evaluated and so the value of i remains the same.


Similarly when && operator is involved in an expression, when any of the operands become false, the whole expression’s truth value becomes false and hence the remaining expression will not be evaluated.


false && (anything) => false where (anything) will not be evaluated.


 


  1. main(){

register int a=2;


printf("Address of a = %d",&;


printf("Value of a = %d",;


}


Answer:


Compier Error: '&' on register variable


Rule to Remember:


& (address of ) operator cannot be applied on register variables.


  1. 1. const char *a;

2. char* const a;


3. char const *a;


-Differentiate the above declarations.


 


Answer:


1. 'const' applies to char * rather than 'a' ( pointer to a constant char )


*a='F' : illegal


a="Hi" : legal


 


2. 'const' applies to 'a' rather than to the value of a (constant pointer to char )


*a='F' : legal


a="Hi" : illegal


3. Same as 1.


  1. main(){

float i=1.5;


switch(i){


case 1: printf("1");


case 2: printf("2");


default : printf("0");


}


}


Answer:


Compiler Error: switch expression not integral


Explanation:


Switch statements can be applied only to integral types.


 


  1. main(){   

extern i;


printf("%d\n",i);{


int i=20;


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


}


}


Answer:


Linker Error : Unresolved external symbol i


Explanation:


The identifier i is available in the inner block and so using extern has no use in resolving it.


 


  1. main(){

int a=2,*f1,*f2;


f1=f2=&a;


*f2+=*f2+=a+=2.5;


printf("\n%d %d %d",a,*f1,*f2);


}


Answer:


16 16 16


Explanation:


f1 and f2 both refer to the same memory location a. So changes through f1 and f2 ultimately affects only the value of a.


  1. main(){

char *p="GOOD";


char a[ ]="GOOD";


printf("\n sizeof(p) = %d, sizeof(*p) = %d, strlen(p) = %d", sizeof(p), sizeof(*p), strlen(p));


printf("\n sizeof( = %d, strlen( = %d", sizeof(, strlen();


}


Answer:


sizeof(p) = 2, sizeof(*p) = 1, strlen(p) = 4


sizeof( = 5, strlen( = 4


Explanation:


sizeof(p) => sizeof(char*) => 2


sizeof(*p) => sizeof(char) => 1


Similarly,


sizeof( => size of the character array => 5


When sizeof operator is applied to an array it returns the sizeof the array and it is not the same as the sizeof the pointer variable. Here the sizeof( where a is the character array and the size of the array is 5 because the space necessary for the terminating NULL character should also be taken into account.


 


  1. #define DIM( array, type) sizeof(array)/sizeof(type)

main(){


int arr[10];


printf(“The dimension of the array is %d”, DIM(arr, int));


}


Answer:


10


Explanation:


The size of integer array of 10 elements is 10 * sizeof(int). The macro expands to sizeof(arr)/sizeof(int) => 10 * sizeof(int) / sizeof(int) => 10.   


 


  1. int DIM(int array[]) {

return sizeof(array)/sizeof(int );


}


main(){


int arr[10];


printf(“The dimension of the array is %d”, DIM(arr));


}


Answer:


1


Explanation:


Arrays cannot be passed to functions as arguments and only the pointers can be passed. So the argument is equivalent to int * array (this is one of the very few places where [] and * usage are equivalent). The return statement becomes, sizeof(int *)/ sizeof(int) that happens to be equal in this case.

No comments:

Post a Comment