Sep
30
Об областях видимости в языках программирования.
1 балл2 балла3 балла4 балла5 баллов (2 голоса, средний балл: 5 из 5)
Loading ... Loading ...

Вчера в IRC на одном из каналов, которые я посещаю, зашел очередной holywar на тему “почему переменные в PHP, определенные в циклах – не остаются видимыми только в области цикла, а стают видны и поза циклом?”
Я решил провести маленькую проверку на аналогичные вещи в других языках.

Насколько я знаю, в Perl как раз наоборот PHP – переменные определенные внутри тела цикла – видны только в пределах цикла. И подтверждение этому следующий код:

my $a = 0;
for (my $a = 0; $a < 3; $a++) {
}
print $a, "n";

Ниже привожу фрагменты кода, что получились на c, c++, java, javascript:

c++:

#include <iostream>
#include <string>

using namespace std;

int main(int argc, char *argv[ ] ) {

    int a = 0;

    for (int a=0; a <= 2; a++ ) {
    }

    cout << "test a=" << a << endl;

}

c:

#include <iostream>
#include <string>

int main() {
        int a = 0;
        for (int a=0; a<= 2; a++ ) {}
        sprint("[%s]", a);
}

java:

public class testScope {
	public static void main(String[] args) {
		int a = 0;
		for (int a = 0; a < 3; a++) {}
		System.out.println(a);
	}
}

javascript:

var a = 0;
for (var a = 0; a < 3; a++) {}
alert(a);

Каковы итоги? Довольно неожиданны оказались для тех, кто утверждал, что такая реализация только в PHP.

Результаты:

Javascipt : вывел 3.
Java: ошибка на этапе компиляции – область внутри цикла – является глобальной – поэтому переопределение, ранее определенной переменной – не возможно.
(cannot rediclare a)
C++: вывод на экран: test a=0
С: ошибка на этапе компиляции – область внутри цикла – является глобальной – поэтому переопределение, ранее определенной переменной – не возможно.
(a.c:7: error: redefinition of ‘a’
a.c:6: error: previous definition of ‘a’ was here)

Код для с, с++ писался под FreeBSD, компилировался gcc и g++ соотвественно. Для java – был использован Eclipse. Javascript – Edit+ + браузеры.

Оказывается, что так, как это работает в Perl – так работает еще только в c++, а следовательно PHP не является “еретиком” в плане такого поведения – он всего лишь “один из многих”. А вот хорошо или плохо такое поведение – это уже наверное вопрос не этой заметки.



Добавить в:news2.ru Google Delicious Забобрить эту страницу! Добавить на Newsland.ru Добавить на СМИ2 Добавить на RUmarkz Добавить на Ваау! Добавить на rucity.com Добавить в закладки МоёМесто.ru Добавить на Habr Добавить на Moi Novosti Добавить страницу к Mister Wong Добавить на Moikrug Добавить на Myscoop Добавить на 100zakladok

Похожие заметки


Комментарии (6) на “Об областях видимости в языках программирования.”

  1. Vyazovoi написал:
    30.09.2007 в 20:43
    Цитировать
  2. anycolor написал:
    30.09.2007 в 20:55
    Цитировать
  3. Vyazovoi написал:
    30.09.2007 в 21:33
    Цитировать
  4. anycolor написал:
    30.09.2007 в 21:54
    Цитировать
  5. Ni@m написал:
    01.10.2007 в 00:25
    Цитировать
  6. Dmitry Zhariy написал:
    01.10.2007 в 15:28
    Цитировать

Оставить комментарий

Указать свой сайт могут только зарегистрированные пользователи. Регистрация или вход.



Внимание!

XHTML: Вы можете использовать эти теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Quicktags:-->