Это полностью зависит от правил конкретного языка, который вы используете.Ваш пример выглядит как псевдокод, а не как настоящий язык;поэтому ответ может быть любым, что вам нравится.;)
Единственный известный мне реальный язык, который использует вызов за копией, - это Фортран.Я не эксперт по Фортрану, но стандарт Фортрана-2008 выглядит как , утверждая, что ваш пример просто недопустим - если вы попробуете его в Фортране, компилятору будет разрешено делать практически все, что ему захочется.1005 *
Если между действующими аргументами двух разных фиктивных аргументов одной и той же процедуры есть частичное или полное перекрытие, а фиктивные аргументы не имеют ни атрибута POINTER
, ни TARGET
, перекрывающиеся части не должныбыть определенным, переопределенным или стать неопределенным во время выполнения процедуры.Например, в
CALL SUB (A (1:5), A (3:9))
A(3:5)
не должно определяться, переопределяться или становиться неопределенным через первый фиктивный аргумент, поскольку он является частью аргумента, связанного со вторым фиктивным аргументом, и не должен быть определен,переопределено или становится неопределенным через второй фиктивный аргумент, поскольку он является частью аргумента, связанного с первым фиктивным аргументом.A(1:2)
остается определяемым через первый фиктивный аргумент, а A(6:9)
остается определяемым через второй фиктивный аргумент.
ISO / IEC 1539–1: 2010 (E) , p.301, примечание 12.34
На практике я полагаю, что все современные компиляторы Фортрана используют вызов по ссылке вместо вызова по копии, поэтому проблема никогда не возникает.
Вызов-by-copy также используется в Objective-C под капотом (при неясных обстоятельствах ), но этот язык не имеет стандарта или спецификации;это просто определяется тем, что делает компилятор в этом году.Его текущее правило, кажется, состоит в том, что значения копируются обратно в фактические параметры, как они появляются в списке параметров слева направо, так что конечное значение a
будет значением y
, а не значениемx
.Пример:
cat >pass-by-copy.m <<EOF
#import <Foundation/Foundation.h>
void sub(NSString **x, NSString **y) {
*y = @"bar";
*x = @"baz";
}
int main() {
NSString *a = @"foo";
sub(&a,&a); // looks like call-by-reference, is actually call-by-copy
NSLog(@"%@\n", a); // prints "bar", not "baz"
}
EOF
clang -fobjc-arc -framework Foundation pass-by-copy.m -o pass-by-copy
./pass-by-copy
2012-09-02 22:37:26.677 pass-by-copy[72719:707] bar