November 2019

S M T W T F S
      12
34 5 678 9
10111213141516
17181920212223
24252627282930

Style Credit

Expand Cut Tags

No cut tags
Friday, February 19th, 2010 12:09 pm

наглядный пример: жуткий глюк с областями видимости

Оригинал этой записи. Комментировать можно тут или там.

Любые материалы из этого блога запрещается использовать на сайте livejournal.ru в любой форме и любом объёме

Friday, February 19th, 2010 11:20 am (UTC)
Человека ожидал увидеть нормальный язык. А не сошлось.
Friday, February 19th, 2010 11:23 am (UTC)
а немножко подумать - не судьба была, видать. не может каждый блок вводить новую область видимости для _всех_ переменных. этого ни в одном языке нет
Friday, February 19th, 2010 11:46 am (UTC)
например в перле:

{
my $a=1;
print("1. a=$a\n");
{
my $a=2;
print("2. a=$a\n");
}
print("3. a=$a\n");
}
print("4. a=$a\n");

вывод:
1. a=1
2. a=2
3. a=1
4. a=

такого поведения автор и ожидал, как я понимаю.
Friday, February 19th, 2010 11:48 am (UTC)
угу, это если явно объявлять в каждом блоке my $a.
а если не объявлять, то он будет себя вести точно так же, как php - будет одна общая переменная.
Friday, February 19th, 2010 11:53 am (UTC)
ну нельзя в php явно объявить переменную, да :(
Friday, February 19th, 2010 11:55 am (UTC)
и потому авторы языка поступили логично: сделали отдельную область видимости только для одного типа блоков: для функций.
Friday, February 19th, 2010 12:01 pm (UTC)
логично, согласен.
Friday, February 19th, 2010 11:50 am (UTC)
это я к тому, что новая область видимости срабатывает не для _всех_ переменных, а только для тех, которые были явно объявлены внутри блока
Friday, February 19th, 2010 11:49 am (UTC)
Почему не может? Вот вопрос с тем, надо ли давать переопределять уже определенные переменные - неоднозначный. Хотя уж точно не надо делать это неявно.

Грубо говоря:
{
int i = 1;
{
i = 2; // явно просто присваивание переменной из родительской области видимости
int i = 3; // а вот здесь чего делаем? я бы ошибку выбрасывал, а то потом в коде каша будет.
}
}
(deleted comment)
Friday, February 19th, 2010 11:56 am (UTC)
Ну вот поэтому я склоняюсь к мысли, что компилятор должен взять в руки линейку и бить ей за такое по рукам.
Friday, February 19th, 2010 12:00 pm (UTC)
g++ -Wall даже не поперхнулся на этом примере.
я бы на его месте выдал предупреждение, что так делать не нужно, хотя, конечно, если очень хочется, то можно
Friday, February 19th, 2010 11:56 am (UTC)
для c++ такая конструкция валидна. внутри блока до объявления видна внешняя переменная, после объявления до конца блока - внутренняя.

другой вопрос, что за такой стиль программирования надо убивать на месте, независимо от языка
Friday, February 19th, 2010 07:09 pm (UTC)
+1.