Каковы будут результаты следующей программы на C ++, предполагающей динамическое определение объема?
У меня есть компилятор TurboC ++, в котором показанный вывод использует статическую область видимости и ответ таков:
8
6
50
Теперь я сомневаюсь, что выход при условии динамического определения объема будет
или
207
104
52
— или же —
207
104
50
#include<iostream.h>
#include<conio.h>
int n=1;
void printn(int x)
{
cout<<x+n<<"\n";
}
void increment()
{
n=n+2;
printn(n);
}
void main()
{
clrscr();
int n;
n=200;
printn(7);
n=50;
increment();
cout<<n;
getch();
}
Любой соответствующий компилятор выдаст вам ошибки и ничего не выдаст, потому что вы
#include<iostream.h>
после чего вы используете
cout << ...
без квалификации с std::
или имея using
директива и из-за
void main()
После того, как вы это исправите, любой соответствующий компилятор C ++ выведет
8
6
50
Думаю, это довольно стандартный вопрос на курсах по PL.
Предполагая динамическое определение объема (и мутант C ++)
207
104
52
Трудно проверить, так как ваш вопрос, вероятно, является теоретическим упражнением в понимании объема работ. Тем не менее, Perl (который обычно (и, к счастью) статически ограничен) поддерживает динамическую область видимости, если вы об этом попросите, через local
ключевое слово:
my $x = 1; # default lexical scope
local $y = 1; # dynamically scoped.
Итак, если вам это нравится, вы можете переписать свою программу на Perl и попробовать ее на пинки:
sub println {
my $x = shift;
printf "%d\n", $x + $n;
}
sub increment {
$n = $n + 2;
println($n);
}
sub main {
local $n = 200; # $n will be dynamically scoped!
println(7);
$n = 50;
increment();
print "$n\n";
}
main();
Дает тебе 207 104 52
,