6k views

Which one of the choices given below would be printed when the following program is executed?

#include <stdio.h>
void swap (int *x, int *y)
{
static int *temp;
temp = x;
x = y;
y = temp;
}
void printab ()
{
static int i, a = -3, b = -6;
i = 0;
while (i <= 4)
{
if ((i++)%2 == 1) continue;
a = a + i;
b = b + i;
}
swap (&a, &b);
printf("a =  %d, b = %d\n", a, b);
}
main()
{
printab();
printab();
}
1. $a = 0, b = 3$
$a = 0, b = 3$
2. $a = 3, b = 0$
$a = 12, b = 9$
3. $a = 3, b = 6$
$a = 3, b = 6$
4. $a = 6, b = 3$
$a = 15, b = 12$

edited | 6k views
+1
swap( ) only change the addresses , not the values
+4
i get it, that the answer is d, as i calculated value of a as 6 and b as 3.

okay. but how does the loop run agai? i is 5 when the printab function is called, so the loop should not execute even once
+3

Continue keyword is used to skip the statements in the loop and directly go to the next iteration right ?

 while (i <= 4)
{
if ((i++)%2 == 1) continue;
a = a + i;
b = b + i;
}

so for odd values of i it skips which means a and b is added with 2 and 4

why is odd value considered ?

+1
it is not skipping odd values it is just taking odd values because odd%2=1 , continue means if it is not then again do it so even values of i will not be added in a or b
0
while (i <= 4)
{
if ((i++)%2 == 1) continue;
a = a + i;
b = b + i;
}

It means if odd no. then Skip it because of continue keyword. Then why in  answer 1+3+5 is added.

0
Because the corresponding numbers are added after their increment. (0, 2, 4) are added to a and b after their increment. Therefore, (1+3+5) are added.
0
Yes.
0

First of all, the swap function just swaps the pointers inside the function and has no effect on the variables being passed.

Inside printab, a and b are added odd integers from $1$-$5$, i.e., $1+3+5 = 9$. So, in first call to printab, $a = -3 + 9 = 6$ and $b = -6 + 9 = 3$.

Static variables have one memory throughout program run (initialized during program start) and they keep their values across function calls. So, during second call to printab, $a = 6 + 9 = 15$, $b = 3 + 9 = 12$.

Hence, (D) is choice.

by Veteran (431k points)
edited
+2
sir, why after the 2nd call to printab(), i becomes to 0?. As i is static variable so it must retains its value in 2nd call that was at the end of 1st call i.e 5.
+40
because of i = 0; This is not an initialization but an assignment.
+2
:-p, thanx
+1
Can someone please explain the if condition part?

i is incremented on each condition. Initially i=0, In the first iteration, i++ will be incremented before checking the modulus. So, following that shouldn't even numbers be added to a and b?

+12
i++ returns the value of "i" and so the value of i is used for mod operation and after this only i is getting incremented- it is post increment. "post" means after returning the current value of "i" for the expression, the value of i is incremented sometime before the next sequence point.
0
Thank you @Arjun Sir.

Missed the sequence points. So there's no effect on this expression by parenthesis.
+5
parenthesis is useless here because ++ anyway has higher precedence than %. Parenthesis just clears this for the reader.

i++ happens first, but this operation always returns the value of i, and i gets incremented later as a side-effect.
+2
Sir how can 5 be added???? Because 4%2!=0.. So only 1 and 3 must be added. Correct me if i am wrong
+6
As here post increment is used ...when i=0 the if part evaluates to false and after that value of i becomes 1 i.e. before incrememting a and b,and so 1 is added to a and b.Next time i=1 is compared in if which  evaluates to true so continue gets executed (Note here value of i becomes 2).....Similarly i=2 is compared and condition becomes false and 3 gets added to a and b.Similarly  5 is added to a and b.
0
After 1st function call, output is 6 3. On second call, i again changes to 0 but a & b remains same i.e. a=6, b=3.

After 2nd call finishes, a=a+ 9= 6+9 = 15 and b= b+9 = 3+9 = 12.
+1
the while loop runs until i is less than or equal to 4 why operating the loop till i = 5??
0
here only i is static or i,a,b all are static??
+2
All 3 variables are static.
0
Why i changes to 0, if it is static variable?
+3
Because making i static and assigning it '0' are in different line of code.
0
That doesn't make any difference I think.

We cannot reinitialize static variable again,it can only be initialized at once during start.
0
@Arjun sir, sequence point is the if statement no?
0
yes.
0
@arjun sir difference between initialization and assignment in c ??? anyone??
+3
@Puja Initialization is the assignment done when memory is created.
0
it means we will do modulus first and then according to post increment value of i will be incremente later
+1
yes in post increment, expression will be evaluated first then increment will happen,

(i++)%2 => i%2; I++;
0
Why swap function doesn't swap the values, it is call by reference right?
0
Sir may you please tell why swap() has no effect on values of a & b? As it's call by reference.
0
So you are saying that C language is having call by reference?
+2
Sir now I understood from one of your answer, related to call by value and reference in C. C has only pass by value.
0
Can someone explain what's happening inside the swap function
0

swap will not work here becoz here swapping the addresses not value right?

+1

@jk_1, value stored in pointer which is address of variables will change.

0
if ((i++)%2 == 1) continue;

what does this line mean

i++; if( i % 2 == 1)   or    if ( i % 2 == 1)  i++;

If I think as post increment then 2nd one is correct,but confusion arises because of ( ) given

0
Sir, had it been static int i=0, what should be output for second call of printab().
0
In swap function x and y have address of a and b. And they are swapping address.

If there is code segment like

*Temp=*x;

*x=*y;

*y=*Temp;

Then definitely value will be swapped
0
Right.
while (i <= 4
{
if ((i++)%2 == 1) continue; // key point of program here if comdition true
then go to while loop directly
a = a + i; // will process when i= even
b = b + i; // will process when i= even
}


Inside printab, a and b are added odd integers from

for i= 1 a= -3 + 1 = -2  and b = -6+1= -5

for i= 3 a= -2 + 3 = 1  and b = -5+3= --2

for i= 5 a= 1 + 5 = 6  and b = -2 +5= 3

here printf(a,b) = 6,3

if static int i= 0; given in code then only old value of i is used.
since static int i and i= 0 is given so for next printab () i= 0 is taken.
By looking 1st  printf(a,b) = 6,3 

Ans is D

reffer for continue:https://www.codingunit.com/c-tutorial-for-loop-while-loop-break-and-continue

by Veteran (63k points)
edited
0

@ prashant in the above link it says  " It is also possible to use ++i or --i. The difference is is that with ++i (prefix incrementing) the one is added before the “for loop” tests if i < 10. With i++ (postfix incrementing) the one is added after the test i < 10."

is it right ....??? plz clear my doubt.

+2
Why i is reintianlize to 0?

, as i is static variable and intialize only once, in second printable() i should star with 5,

Correct me if wrong somewhere!
+1
when i=5 then loop terminates then  how i=5 is calculated?
0
In for loop prefix increment and postfix increment both are same
But in while loop make difference
i++ means first test condition then increment
++i means first increment then test condition

0

@Ram Swaroop

since the brackets have more precedence then why (i++) is not incrementing first and then checking the condition ?

In your example given you have used ++i and not (++i).

$main()$

$\downarrow$

$printab()$

$\fbox{static i=0}$ $\fbox{static a=-3}$$\fbox{static b=-6}$

$i=0$

$1.while(0<=4)\{$

$if(0\%2==1)// condition\ false$

$\fbox{i=1}$

$a=-3+1=-2$

$b=-6+1=-5$

$2.while(1<=4)\{$

$if(1\%2==1)\ continue;$

$\fbox{i=2}$

$3.while(2<=4)\{$

$if(2\%2==1)// condition\ false$

$\fbox{i=3}$

$a=-2+3=1$

$b=-5+3=-2$

$4.while(3<=4)\{$

$if(3\%2==1)\ continue;$

$\fbox{i=4}$

$5.while(4<=4)\{$

$if(4\%2==1)// condition\ false$

$\fbox{i=5}$

$a=1+5=6$

$b=-2+5=3$

$6.while(5<=4)// condition\ false$

$\downarrow$

$swap(\&a,\&b)$

Important to notice: It will swap the pointers not the values.

Print the values of $a,b=6,3$

Again call $printab();$

.

.

Print the values of $a,b=15,12$

$Ans: D$

by Active (4.2k points)
edited
        if ((i++)%2 == 1) continue;


This is the heart of the code. continue will make the compiler skip rest of the lines in the loop, and go straight back to checking the loop condition again.
Post increment will increment i after checking the condition.

When i = 0, we won't hit continue. So, add 1 (and not 0, because post-increment)

When i = 1, we hit continue. So skip rest of the lines.

When i = 2, add 3.

When i = 3, we hit continue.

When i = 4, add 5.

Break out of while loop now. Because i = 5.

So finally; $a = -3 + 1 + 3 + 5 = 6$. And $b = -6 + 1 + 3 + 5 = 3$

Swap doesn't do anything to the values inside a and b, so a and b stay intact.

a = 6, b = 3

Option D.

Now, when printab() is called the second time, i = 5. But in the immediate next line, i = 0. So, while loop will run the same.
$a = 6 + 1 + 3 + 5 = 15$
$b = 3 + 1 + 3 + 5 = 12$

by Loyal (6.6k points)

a =  6, b = 3
a =  15, b = 12

i.e option D
by Active (1.9k points)
0
@arjun In the 2nd printab() call, i value will be 5 since it is static variable and we cannot re-initialize it. So why a=15,b=12?