function — Что будет выводом следующей программы на C ++, предполагающей динамическую область видимости?

Каковы будут результаты следующей программы на 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();
}

0

Решение

Любой соответствующий компилятор выдаст вам ошибки и ничего не выдаст, потому что вы

#include<iostream.h>

после чего вы используете

cout << ...

без квалификации с std:: или имея using директива и из-за

void main()

После того, как вы это исправите, любой соответствующий компилятор C ++ выведет

8
6
50
1

Другие решения

Думаю, это довольно стандартный вопрос на курсах по 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,

0

По вопросам рекламы [email protected]