The Gateway to Computer Science Excellence
+48 votes

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);
  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$
in Programming by Boss (16.3k points)
edited by | 6k views
swap( ) only change the addresses , not the values
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

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 ?

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

Please explain 

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.

5 Answers

+59 votes
Best answer

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 by
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.
because of i = 0; This is not an initialization but an assignment.
:-p, thanx
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?

Executed the program and odd numbers are being added to the variables. Can't figure what I'm missing. Please help
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.
Thank you @Arjun Sir.

Missed the sequence points. So there's no effect on this expression by parenthesis.
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.
Sir how can 5 be added???? Because 4%2!=0.. So only 1 and 3 must be added. Correct me if i am wrong
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.
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.
the while loop runs until i is less than or equal to 4 why operating the loop till i = 5??
here only i is static or i,a,b all are static??
All 3 variables are static.
Why i changes to 0, if it is static variable?
Because making i static and assigning it '0' are in different line of code.
That doesn't make any difference I think.

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

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

@Shubhgupta @Arjun sir

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


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

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

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

If there is code segment like




Then definitely value will be swapped
+23 votes
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:

by Veteran (63k points)
edited by

@ 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.

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!
when i=5 then loop terminates then  how i=5 is calculated?
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


@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).

+6 votes




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



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





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



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





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



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




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



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 by
+4 votes
        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)
+3 votes
answer should be:

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

i.e option D
by Active (1.9k points)
@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?

Related questions

Quick search syntax
tags tag:apple
author user:martin
title title:apple
content content:apple
exclude -tag:apple
force match +apple
views views:100
score score:10
answers answers:2
is accepted isaccepted:true
is closed isclosed:true
50,737 questions
57,324 answers
105,170 users