51.
#include<stdio.h>
main()
{
char s[]={'a','b','c','\n','c','\0'};
char *p,*str,*str1;
p=&s[3];
str=p;
str1=s;
printf("%d",++*p + ++*str1-32);
}
{
char s[]={'a','b','c','\n','c','\0'};
char *p,*str,*str1;
p=&s[3];
str=p;
str1=s;
printf("%d",++*p + ++*str1-32);
}
Answer: 77
Explanation: p is pointing to character '\n'.
str1 is pointing to character 'a' ++*p. "p is pointing to '\n' and that is
incremented by one." the ASCII value of '\n' is 10, which is then
incremented to 11. The value of ++*p is 11. ++*str1, str1 is pointing to 'a'
that is incremented by 1 and it becomes 'b'. ASCII value of 'b' is 98.
Now performing (11 + 98 – 32), we get
77("M"); So we get the output 77 :: "M" (Ascii is 77).
52.
#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);
}
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: SomeGarbageValue---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,
it will print first element of 3D array.
53.
#include<stdio.h>
main()
{
struct xx
{
int x=3;
char name[]="hello";
};
struct xx *s;
printf("%d",s->x);
printf("%s",s->name);
}
{
struct xx
{
int x=3;
char name[]="hello";
};
struct xx *s;
printf("%d",s->x);
printf("%s",s->name);
}
Answer: Compiler Error
Explanation: You should not initialize
variables in declaration
54.
#include<stdio.h>
main()
{
struct xx
{
int x;
struct yy
{
char s;
struct xx *p;
};
struct yy *q;
};
}
struct xx
{
int x;
struct yy
{
char s;
struct xx *p;
};
struct yy *q;
};
}
Answer: Compiler Error
Explanation: The structure yy is nested
within structure xx. Hence, the elements are of yy are to be accessed through
the instance of structure xx, which needs an instance of yy to be known. If the
instance is created after defining the structure the compiler will not know
about the instance relative to xx. Hence for nested structure yy you have to
declare member.
55. main()
{
printf("\nab");
printf("\bsi");
printf("\rha");
}
{
printf("\nab");
printf("\bsi");
printf("\rha");
}
Answer: hai
Explanation:
\n - newline
\b - backspace
\r - linefeed
\n - newline
\b - backspace
\r - linefeed
56. main()
{
int i=5;
printf("%d%d%d%d%d%d",i++,i--,++i,--i,i);
}
{
int i=5;
printf("%d%d%d%d%d%d",i++,i--,++i,--i,i);
}
Answer: 45545
Explanation: The arguments in a function call
are pushed into the stack from left to right. The evaluation is by popping out
from the stack. And the evaluation is from right to left, hence the result.
57. #define square(x)
x*x
main()
{
int i;
i = 64/square(4);
printf("%d",i);
}
main()
{
int i;
i = 64/square(4);
printf("%d",i);
}
Answer: 64
Explanation: the macro call square(4) will
substituted by 4*4 so the expression becomes i = 64/4*4 . Since / and * has
equal priority the expression will be evaluated as (64/4)*4 i.e. 16*4 = 64
58. main()
{
char *p="hai friends",*p1;
p1=p;
while(*p!='\0') ++*p++;
printf("%s %s",p,p1);
}
{
char *p="hai friends",*p1;
p1=p;
while(*p!='\0') ++*p++;
printf("%s %s",p,p1);
}
Answer: ibj!gsjfoet
Explanation: ++*p++ will be parse in the
given order
_ *p that is value at the location currently
pointed by p will be taken
_ ++*p the retrieved value will be incremented
_ when; is encountered the location will be incremented that is p++ will be executed Hence, in the while loop initial value pointed by p is ‘h’, which is changed to ‘i’ by executing ++*p and pointer moves to point, ‘a’ which is similarly changed to ‘b’ and so on. Similarly blank space is converted to ‘!’. Thus, we obtain value in p becomes “ibj!gsjfoet” and since p reaches ‘\0’ and p1 points to p thus p1doesnot print anything.
_ ++*p the retrieved value will be incremented
_ when; is encountered the location will be incremented that is p++ will be executed Hence, in the while loop initial value pointed by p is ‘h’, which is changed to ‘i’ by executing ++*p and pointer moves to point, ‘a’ which is similarly changed to ‘b’ and so on. Similarly blank space is converted to ‘!’. Thus, we obtain value in p becomes “ibj!gsjfoet” and since p reaches ‘\0’ and p1 points to p thus p1doesnot print anything.
59. #include
<stdio.h>
#define a 10
main()
{
#define a 50
printf("%d",a);
}
#define a 10
main()
{
#define a 50
printf("%d",a);
}
Answer: 50
Explanation: The preprocessor directives can
be redefined anywhere in the program. So the most recently assigned value will
be taken.
60. #define clrscr()
100
main()
{
clrscr();
printf("%d\n",clrscr());
}
{
clrscr();
printf("%d\n",clrscr());
}
Answer: 100
Explanation: Preprocessor executes as a
seperate pass before the execution of the compiler. So textual replacement of
clrscr() to 100 occurs. The input program to compiler looks like this :
main()
{
100;
printf("%d\n",100);
}
{
100;
printf("%d\n",100);
}
Note: 100; is an executable statement
but with no action. So it doesn't give any problem
61. main()
{
41printf("%p",main);
}8
{
41printf("%p",main);
}8
Answer: Some address will be printed.
Explanation: Function names are just
addresses (just like array names are addresses). main() is also a function. So
the address of function main will be printed. %p in printf specifies that the
argument is an address. They are printed as hexadecimal numbers.
62. main()
{
clrscr();
}
clrscr();
{
clrscr();
}
clrscr();
Answer: No output/error
Explanation: The first clrscr() occurs inside
a function. So it becomes a function call. In the second clrscr(); is a
function declaration (because it is not inside any function).
63. enum colors
{BLACK,BLUE,GREEN}
main()
{
printf("%d..%d..%d",BLACK,BLUE,GREEN);
return(1);
}
main()
{
printf("%d..%d..%d",BLACK,BLUE,GREEN);
return(1);
}
Answer: 0..1..2
Explanation: enum assigns numbers starting
from 0, if not explicitly defined.
64. void main()
{
char far *farther,*farthest;
printf("%d..%d",sizeof(farther),sizeof(farthest));
}
{
char far *farther,*farthest;
printf("%d..%d",sizeof(farther),sizeof(farthest));
}
Answer: 4..2
Explanation: The second pointer is of char
type and not a far pointer
65. main()
{
int i=400,j=300;
printf("%d..%d");
}
{
int i=400,j=300;
printf("%d..%d");
}
Answer: 400..300
Explanation: printf takes the values of the
first two assignments of the program. Any number of printf's may be given. All
of them take only the first two values. If more number of assignments given in
the program,then printf will take garbage values.
66. main()
{
char *p;
p="Hello";
printf("%c\n",*&*p);
}
{
char *p;
p="Hello";
printf("%c\n",*&*p);
}
Answer: H
Explanation: * is a dereference operator
& is a reference operator. They can be applied any number of times provided
it is meaningful. Here p points to the first character in the string
"Hello". *p dereferences it and so its value is H. Again &
references it to an address and * dereferences it to the value H.
67. main()
{
int i=1;
while (i<=5)
{
printf("%d",i);
if (i>2)
goto here;
i++;
}
}
fun()
{
here:
printf("PP");
}
{
int i=1;
while (i<=5)
{
printf("%d",i);
if (i>2)
goto here;
i++;
}
}
fun()
{
here:
printf("PP");
}
Answer: Compiler error: Undefined label
'here' in function main
Explanation: Labels have functions scope, in
other words the scope of the labels is limited to functions. The label 'here'
is available in function fun() Hence it is not visible in function main.
68. main()
{
static char names[5][20]={"pascal","ada","cobol","fortran","perl"};
int i;
char *t;
t=names[3];
names[3]=names[4];
names[4]=t;
for (i=0;i<=4;i++)
printf("%s",names[i]);
}
{
static char names[5][20]={"pascal","ada","cobol","fortran","perl"};
int i;
char *t;
t=names[3];
names[3]=names[4];
names[4]=t;
for (i=0;i<=4;i++)
printf("%s",names[i]);
}
Answer: Compiler error: Lvalue required in
function main
Explanation: Array names are pointer
constants. So it cannot be modified.
69. void main()
{
int i=5;
printf("%d",i++ + ++i);
}
{
int i=5;
printf("%d",i++ + ++i);
}
Answer: Output Cannot be predicted exactly.
Explanation: Side effects are involved in the
evaluation of i
70. void main()
{
int i=5;
printf("%d",i+++++i);
}
{
int i=5;
printf("%d",i+++++i);
}
Answer: Compiler Error
Explanation: The expression i+++++i is parsed
as i ++ ++ + i which is an illegal combination of operators.
71. #include<stdio.h>
main()
{
int i=1,j=2;
switch(i)
{
case 1: printf("GOOD");
break;
case j: printf("BAD");
main()
{
int i=1,j=2;
switch(i)
{
case 1: printf("GOOD");
break;
case j: printf("BAD");
break;
}
}
Answer: Compiler Error: Constant expression
required in function main.
Explanation: The case statement can have only
constant expressions (this implies that we cannot use variable names directly
so an error).
Note: Enumerated types can be used in
case statements.
72. main()
{
int i;
printf("%d",scanf("%d",&i)); // value 10 is given as input here
int i;
printf("%d",scanf("%d",&i)); // value 10 is given as input here
}
Answer: 1
Explanation: Scanf returns number of items
successfully read and not 1/0. Here 10 is given as input which should have been
scanned successfully. So number of items read is 1.
73. #define f(g,g2)
g##g2
main()
{
int var12=100;
printf("%d",f(var,12));
}
{
int var12=100;
printf("%d",f(var,12));
}
Answer: 100
74. main()
{
int i=0;
for(;i++;printf("%d",i)) ;
printf("%d",i);
}
int i=0;
for(;i++;printf("%d",i)) ;
printf("%d",i);
}
Answer: 1
Explanation: before entering into the for
loop the checking condition is "evaluated". Here it evaluates to 0
(false) and comes out of the loop, and i is incremented (note the semicolon
after the for loop).
75.
#include<stdio.h>
main()
{
char s[]={'a','b','c','\n','c','\0'};
char *p,*str,*str1;
p=&s[3];
str=p;
str1=s;
printf("%d",++*p + ++*str1-32);
}
{
char s[]={'a','b','c','\n','c','\0'};
char *p,*str,*str1;
p=&s[3];
str=p;
str1=s;
printf("%d",++*p + ++*str1-32);
}
Answer: M
Explanation: p is pointing to character
'\n'.str1 is pointing to character 'a' ++*p "p is pointing to '\n' and
that is incremented by one." the ASCII value of '\n' is 10. then it is
incremented to 11. the value of ++*p is 11. ++*str1 "str1 is pointing to
'a' that is incremented by 1 and it becomes 'b'. ASCII value of 'b' is 98. Both
11 and 98 is added and result is subtracted from 32. i.e.
(11+98-32)=77("M");
76.
#include<stdio.h>
main()
{
struct xx
{
int x=3;
char name[]="hello";
};
struct xx *s=malloc(sizeof(struct xx));
printf("%d",s->x);
printf("%s",s->name);
}
main()
{
struct xx
{
int x=3;
char name[]="hello";
};
struct xx *s=malloc(sizeof(struct xx));
printf("%d",s->x);
printf("%s",s->name);
}
Answer: Compiler Error
Explanation: Initialization should not be
done for structure members inside the structure declaration
77.
#include<stdio.h>
main()
{
struct xx
{
int x;
struct yy
{
char s;
struct xx *p;
};
struct yy *q;
};
}
{
struct xx
{
int x;
struct yy
{
char s;
struct xx *p;
};
struct yy *q;
};
}
Answer: Compiler Error
Explanation: in the end of nested structure
yy a member have to be declared.
78. main()
{
extern int i;
i=20;
printf("%d",sizeof(i));
}
{
extern int i;
i=20;
printf("%d",sizeof(i));
}
Answer: Linker error: undefined symbol '_i'.
Explanation: extern declaration specifies
that the variable i is defined somewhere else. The compiler passes the external
variable to be resolved by the linker. So compiler doesn't find an error.
During linking the linker searches for the definition of i. Since it is not
found the linker flags an error.
79. main()
{
printf("%d", out);
}
int out=100;
printf("%d", out);
}
int out=100;
Answer: Compiler error: undefined symbol out
in function main.
Explanation: The rule is that a variable is
available for use from the point of declaration. Even though a is a global
variable, it is not available for main. Hence an error.
80. main()
{
extern out;
printf("%d", out);
}
int out=100;
extern out;
printf("%d", out);
}
int out=100;
Answer: 100
Explanation: This is the correct way of
writing the previous program.
No comments:
Post a Comment