Когда формальные параметры не скрывают внешние переменные? - PullRequest
1 голос
/ 10 сентября 2011

Преамбула

Итак, я прохожу The C Programming Language, и эта цитата меня поразила:

Автоматические переменные, включая формальные параметры, также скрывают внешние переменные и функциито же имя.

Пример:

int x;

// x inside of f is different from external f.
void f(double x){}

TL; DR

Это мне кажется чем-то, что обязательно верно для всех языков (и это восходит кк лямбда-кальку.), и все же он входит в эту книгу.Есть ли пример, когда наиболее локальное определение переменной не переопределяет более глобальное определение?

Ответы [ 3 ]

1 голос
/ 10 сентября 2011

Это определенно не необходимое условие для языка. Так уж сложилось, что все языки, которые я могу себе представить, обрабатывают свои области таким образом. Зачем? Возможно, потому, что так было сделано так долго, и это имеет смысл как для компилятора, так и для программиста (подумайте о стеках).

Однако, пока я учился в школе, я провел эксперимент с интерпретированным языком, на котором символы помещались в очередь. Таким образом, самая глобальная область действия вышла за рамки локальных границ. Язык все еще работал и был полностью функциональным. Единственное отличие заключалось в том, что локальные области действия были переопределены глобальными областями действия. Это сводится к тому, чтобы быть осторожнее с именами в более глобальных областях.

0 голосов
/ 10 сентября 2011

В языках с динамической областью видимости внутренний x не будет скрывать внешний x, он будет изменять внешний x. Смотрите пример на странице википедии . Языки с динамической областью видимости, особенно диалекты Lisp, были более распространены, когда был написан K & R Динамическая область видимости плохо взаимодействует с любой системой типов, хотя даже система типов так же слабо реализована, как и Си.

0 голосов
/ 10 сентября 2011

Это была борьба, но я нашел очень, очень слабый пример глобальной переменной, перекрывающей локальную.На самом деле это не считается, но это все, что я смог найти!

Я уверен, что объяснение было включено в K & R, потому что они не хотели предполагать предыдущий опыт программирования.Локальный охват, перекрывающий глобальный охват, является второй натурой для большинства из нас, но у нового человека не было бы этого знания.Заявление об этом явно заставляет задуматься о том, почему это может быть правдой, и это ведет к просветлению!:)

...