+34 votes
5k views

What is the return value of $f(p,p)$, if the value of $p$ is initialized to $5$ before the call? Note that the first parameter is passed by reference, whereas the second parameter is passed by value.

int f (int &x, int c) {
c = c - 1;
if (c==0) return 1;
x = x + 1;
return f(x,c) * x;
}
asked
recategorized | 5k views
0
@Arjun Sir.. If the first parameter were passed by address (using pointers), will it still be undefined behaviour??
0

Apart from what arjun sir explained, rest is not typing mistake or error.

Reference :

https://stackoverflow.com/questions/6877052/use-of-the-operator-in-c-function-signatures

## 1 Answer

+54 votes
Best answer

In GATE 2013 marks were given to all as the same code in C/C++ produces undefined behavior. This is because $*$ is not a sequence point in C/C++. The correct code must replace:

return f(x,c) * x;
with

res = f(x,c); // ';' forms a sequence point
//and all side-effects are guaranteed to be completed here
//-- updation of the x parameter inside f is guaranteed
//to be reflected in the caller from the next point onwards.
return res * x;


In this code, there will be 4 recursive calls with parameters $(6,4), (7,3), (8,2)$ and $(9,1)$. The last call returns $1$. But due to pass by reference, $x$ in all the previous functions is now $9$. Hence, the value returned by $f(p,p)$ will be $9 * 9 * 9 * 9 * 1 = 6561$.

Good Read:

answered by Veteran (400k points)
edited
0

Sir here is the question I am taking about.
https://www.facebook.com/groups/core.cs/permalink/1256338371065080/?comment_id=1256365671062350&comment_tracking=%7B%22tn%22%3A%22R2%22%7D

I have uploaded a picture in the comments about the solution. Can you please look into it?

+4
Moreover

int f (int &x, int c)
$\Lambda$
it should be * not &. I may be wrong. But i never see such thing. So Give me example where i can use this.

Also
x = x + 1; // This is also wrong.
It should be.
*x = *x + 1.
0

" But due to pass by reference, x in all the previous functions is now 9 "

Why this happened ? Can Somone explain plz?

+3
@Pawan Kumar i.e how call by reference work,updated the value hand to hand.
0
Yes, there are many typing mistakes in the question.
+3

Its not a mistake bro.. This concept is called aliasing which is used in C++ . Here you can directly use "x" without any de-referencing operator. Its like a extra name(nick name) to the same variable .

0
Reference...?
0

Does this mean that int &x=p is a way to declare x as a pointer to p?

Also, would x=x+1 mean p=p+1?

0

Code Implementation

Beware, it's only after the problem given in the code has been addressed as suggested by arjun sir. This is not the real program as given in the question.

https://ideone.com/g7Gi6g

0

This is the code for above question:

#include <stdio.h>

int p=5;

int f (int *x, int c) {
c = c - 1;
if (c==0) return 1;
*x = *x + 1;
int res=f(x,c);
return  res*(*x);

}

int main()
{
printf("%d",f(&p,p));

return 0;
}

OUTPUT: 6561

Answer:

+23 votes
2 answers
1
+12 votes
1 answer
2
+11 votes
1 answer
4
+14 votes
2 answers
5