13 votes 13 votes What will be the output of the following program assuming that parameter passing is call by value call by reference call by copy restore procedure P{x, y, z}; begin y:y+1; z: x+x; end; begin a:= b:= 3; P(a+b, a, a); Print(a); end Compiler Design gate1999 parameter-passing normal runtime-environment descriptive + – Kathleen asked Sep 23, 2014 • edited Oct 25, 2017 by srestha Kathleen 5.9k views answer comment Share Follow See all 0 reply Please log in or register to add a comment.
Best answer 19 votes 19 votes Call by Value : 3 Call by Reference : 12 Call by Copy-Restore : 12 The $3$ parameter passing mechanisms are simulated in the following 'C' codes. PS: C language only supports Call by Value and even in the case of pointers, the value of the pointer is getting passed explicitly in a pointer variable. This is different from call by reference (say in C++) where this happens implicitly. The following code for Call-by-Reference and Call-by-copy-restore is just a simulation of the parameter passing behaviour and their implementation in any language need not be the same. Call by Value #include <stdio.h> int foo(int x,int y,int z) { y = y+1; z = x+x; } int main(void) { int a = 3; int b = 3; foo(a+b,a,a); printf("%d",a); return 0; } Call by Reference (Call by reference is simulated by passing address in C) : #include <stdio.h> int foo(int *x,int *y,int *z) { *y = *y+1; *z = *x+*x; } int main(void) { int a = 3; int b = 3; int c = a+b; foo(&c,&a,&a); printf("%d",a); return 0; } Call by Copy-Restore: #include <stdio.h> void foo(int *x,int *y,int *z) { *y = *y+1; *z = *x+*x; } int main(void) { int a=3; int b=3; int c=a+b; int d,e; d = c;//copy e = a;//copy foo(&d,&e,&e); a = e;//restore c = d;//restore printf("%d",a); return 0; } Aditya answered Sep 23, 2015 • selected May 3, 2021 by gatecse Aditya comment Share Follow See all 9 Comments See all 9 9 Comments reply Show 6 previous comments Kiyoshi commented May 7, 2021 reply Follow Share @mohitp Yes you are right. your link is amazing..Understood the whole concept. 1 votes 1 votes MrBananaMan commented Nov 19, 2021 reply Follow Share call by reference function is like macro function in C. answer should be 14. please check and update 0 votes 0 votes John_Smith commented Nov 19, 2023 reply Follow Share @Aditya There seems to be two issues with your approach:- In copy-restore, you seem to be restoring the value of the expression \(a+b\). To the best of my knowledge, copy-restore only restores values for variables/arguments/expressions that have an associated l-value. \(a+b\) doesn’t seem to have an inherent l-value, right? How do you know the order of restoring the values for variables/arguments/expressions is left-to-right? \(12\) seems to be the answer only when the last variable to be restored is \(z\), preceded by \(y\). If we were to restore \(z\), followed by \(y\), then \(a\) seems to possess a value of \(4\) instead. 0 votes 0 votes Please log in or register to add a comment.