search
Log In
54 votes
8.3k 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
edited by
8.3k 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. 

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

My one and only doubt is:

"WHY IS STATIC VARIABLE REINITIALIZED TO '0' DURING 2nd FUNCTION CALL"
Since value of static variable is initialized only ones! 

Please see this for reference :

0
static line execute only once, after the second function call of printab(), the first line will not be executed so a and b remain 6 and 3, but " i " initialize again by 0. So i is no more 5.
0

@RavGopal, I got it. Thank you 🙂

6 Answers

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


edited by
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

@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().
1
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.
24 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
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?
1
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).

0

same doubt ...did u got it?

0
If we use bracket then definitely  bracket have higher precedence than any increment or decrement operator

But in example we are using only i++ and ++Iso it work normal as post increment and pre increment operator work.
0

@googlegoku what you're not getting

 

0
@
int i=0;
" if ((i++)%2 == 1) "

why i is incremented after %2 operation is done even though i++ is in bracket 

 

 

0
You are talking about the actual gate questionsorry I think wrong  you are asking about my comment

@googlegoku
We know unary operators (++,--) have higher precedence than arithmetic operators but here () have useless because of post increment operator
you can try this code
int main(void) {

int i =0;
while (i<=4)
{
if ((i++)%2==1) continue;

printf ("%d", i);
}
   
    return 0;
}

Answer 135
9 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
5 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 votes
answer should be:

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

i.e option D
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?
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:

Related questions

49 votes
7 answers
1
4.4k 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, 56, 28, 29}; int a3[] = {-12, 27, -31}; int *x[] = {a1, a2, a3}; void print(int *a[]) { printf("%d,", a[0][2]); printf("%d,", ... } main() { print(x); } $8, -12, 7, 23, 8$ $8, 8, 7, 23, 7$ $-12, -12, 27, -31, 23$ $-12, -12, 27, -31, 56$
asked Nov 1, 2014 in Programming Ishrat Jahan 4.4k views
62 votes
9 answers
2
8.8k 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, "better", 6, "jungle", 8, "ancestor", 7, "brother"}; main () { struct test *p = st; p += 1; ++p -> c; ... ); } $\text{jungle, n, 8, nclastor}$ $\text{etter, u, 6, ungle}$ $\text{cetter, k, 6, jungle}$ $\text{etter, u, 8, ncestor}$
asked Nov 1, 2014 in Programming Ishrat Jahan 8.8k views
5 votes
2 answers
3
903 views
Match the following concepts and their best possible descriptions. Concept Description i. overloading a. allows to define a class to have properties of another class ii. friend b. defining a set of similar functions iii. constructor c. used in dereferencing iv. protected d. used to give a non-member function access to the ... i-c, ii-f, iii-h, iv-a, v-g, vi-d i-b, ii-e, iii-c, iv-f, v-g, vi-s
asked Nov 1, 2014 in Object Oriented Programming Ishrat Jahan 903 views
14 votes
4 answers
4
3.5k views
Consider the C program below. What does it print? # include <stdio.h> # define swapl (a, b) tmp = a; a = b; b = tmp void swap2 ( int a, int b) { int tmp; tmp = a; a = b; b = tmp; } void swap3 (int*a, int*b) { int tmp; tmp = *a; *a = *b; *b = tmp; } int main () { int num1 ... (num1 + 1, num2);} if (num1 > = num2) {swap3 (&num1, &num2);} printf ("%d, %d", num1, num2); } $5, 5$ $5, 4$ $4, 5$ $4, 4$
asked Oct 29, 2014 in Programming Ishrat Jahan 3.5k views
...