• edited by
41,249 views
117 117 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);
}
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$

8 Answers

Best answer
104 104 votes

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. 

• edited by
37 37 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:https://www.codingunit.com/c-tutorial-for-loop-while-loop-break-and-continue

• edited by
36 36 votes

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

• edited by
8 8 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$

3 3 votes
answer should be:

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

i.e option D
0 0 votes

the given code can be simplified as the code below without changing its meaning and output.

#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)
    {
        //we have to increment i irrespective of the number being odd or even
        if (i % 2 == 1) //if i is odd
        {

            i++; // i is incremented here when it is odd
            continue;
        }

        
        i++; //i is incremented here when it is even
        a = a + i;
        b = b + i;
    }



    //we can remove the swap function since it only swaps the pointers to a,b and has no effect on a,b values themselves.
    //swap(&a, &b);
    printf("a =  %d, b = %d\n", a, b);
}
int main()
{
    printab();
    printab();
    return 0;
}

 

Answer:
Position:
Show:

Related questions

101 101 votes
8 answers 8 answers
24.2k
24.2k views
Ishrat Jahan asked Oct 31, 2014
24,230 views
Which one of the choices given below would be printed when the following program is executed? #include <stdio.h int a1[] = {6, 7, 8, 18, 34, 67}; int a2[] = {23, 5...
150 150 votes
7 answers 7 answers
40.6k
40.6k views
Ishrat Jahan asked Oct 31, 2014
40,611 views
Which one of the choices given below would be printed when the following program is executed ?#include <stdio.h struct test { int i; char *c; }st[] = {5, "become", 4, "be...
33 33 votes
7 answers 7 answers
18.1k
18.1k views
Ishrat Jahan asked Oct 28, 2014
18,099 views
Consider the C program below. What does it print?# include <stdio.h # define swap1 (a, b) tmp = a; a = b; b = tmp void swap2 ( int a, int b) { int tmp; tmp = a; a = b; b ...
17 17 votes
2 answers 2 answers
10.0k
10.0k views
Rucha Shelke asked Sep 26, 2014
9,970 views
Consider the following code written in a pass-by-reference language like FORTRAN and these statements about the code. subroutine swap(ix,iy) it = ix L1 : ix = iy L2 : iy ...