The Gateway to Computer Science Excellence
+41 votes
5.5k 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$
in Programming by Boss (16.3k points)
edited by | 5.5k views
0
swap( ) only change the addresses , not the values
+3
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. 

Please explain 

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.

4 Answers

+57 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 (424k points)
edited by
0
Why i changes to 0, if it is static variable?
+2
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??
+2
@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

@Shubhgupta @Arjun sir

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

by Veteran (62.7k points)
edited by
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).

+3 votes
answer should be:

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?
+1 vote
        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 Active (2k points)

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,647 questions
56,473 answers
195,391 comments
100,365 users