Извикване по стойност
x
и y
в p
са локални променливи, инициализирани с действителните параметри, докато i
е глобална променлива, така че извикването p( a[i],a[i] )
е еквивалентно на:
x := 1 /* The value of a[i] */
y := 1 /* The value of a[i] */
x := 2 /* x + 1 */
i := 2 /* i + 1 */
y := 2 /* y + 1 */
и накрая се отпечатват стойностите 1, 2, тъй като те са стойностите на a[1]
, a[2]
, които не са променени.
Обаждане чрез справка
И x
, и y
в p
са псевдоними за a[1]
и (отново) a[1]
(от i = 1
, когато се извиква процедурата), така че извикването е еквивалентно на:
a[1] := 2 /* a[1] + 1 */
i := 2 /* i + 1 */
a[1] := 3 /* a[1] + 1 */
и накрая се отпечатват стойностите 3, 2.
Обаждане по име
Извикването по име е еквивалентно на извикването по препратка, когато прости променливи се предават като параметри, но е различно, когато предавате израз, който обозначава място в паметта, като долен индекс. В този случай действителният параметър се преоценява всеки път, когато се срещне. Така че в този случай това е ефектът от извикването на p( a[i],a[i] )
:
a[1] := 2 /* since i = 1, the result is equal to a[1] + 1 */
i := 2 /* i + 1 */
a[2] := 3 /* since i is now 2, the result is equal to a[2] + 1 */
и накрая се отпечатват стойностите 2, 3. На практика реализацията извиква анонимна функция („thunk“), всеки път, когато трябва да оцени параметър.
Резултат от извикване по стойност
Само за да завършим дискусията, тук е случаят с предаването на параметър стойност-резултат, при който x
и y
се инициализират в началото на изпълнението на процедурата със стойностите на действителните параметри и в края на изпълнението на процедура, се копират обратно към оригиналните променливи адреси:
x := 1 /* The value of a[i] */
y := 1 /* The value of a[i] */
x := 2 /* x + 1 */
i := 2 /* i + 1 */
y := 2 /* y + 1 */
a[1] := 2 /* the value of x is copied back to a[1] */
a[1] := 2 /* the value of y is copied back to a[1] (not a[2]!) */
и накрая се отпечатват стойностите 2, 2.
За обсъждане на различните начини за предаване на параметри вижте например това.
person
Renzo
schedule
26.09.2015