Arjun Suresh (talk | contribs) |
Arjun Suresh (talk | contribs) |
||
(3 intermediate revisions by the same user not shown) | |||
Line 19: | Line 19: | ||
===Solution=== | ===Solution=== | ||
− | 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. The correct code must replace | + | 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; | return f(x,c) * x; | ||
with | with | ||
Line 31: | Line 31: | ||
[[Category: GATE2013]] | [[Category: GATE2013]] | ||
− | [[Category: | + | [[Category: Programming Languages questions from GATE]] |
[[Category:Coding Questions]] | [[Category:Coding Questions]] |
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.
<syntaxhighlight lang="c">
int f (int &x, int c) {
c = c - 1; if (c==0) return 1; x = x + 1; return f(x,c) * x;
} </syntaxhighlight >
(A) 3024
(B) 6561
(C) 55440
(D) 161051
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); 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.
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.
<syntaxhighlight lang="c">
int f (int &x, int c) {
c = c - 1; if (c==0) return 1; x = x + 1; return f(x,c) * x;
} </syntaxhighlight >
(A) 3024
(B) 6561
(C) 55440
(D) 161051
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. The correct code must replace
return f(x,c) * x;
with
res = f(x,c); 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.