Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Клуб программистов > Свободное общение
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.08.2010, 13:01   #1
zumm
БохЪ
Форумчанин
 
Аватар для zumm
 
Регистрация: 30.09.2009
Сообщений: 724
По умолчанию Загадка

Доброго всем! Нужно было поработать в страрой паскалевской среде TP 7.1 и наткнулся на очень, для меня по крайней мере, интересное исключение. вот например:

Код:
x:=2;
if x>2 then
  if x<4 then
    y:=1
else
  y:=2;
Чему равен Y?

Код:
x:=2;
if x>2 then
  if x<4 then
    y:=1
  else
    y:=2;
А тут?

По сути код не изменился, кроме пары лишних табов, а вот сама суть в корне меняется, если в первом случае (когда else привязан к первой проверке) Y будет равно 2, то во втором случае (когда else привязан ко втрой проверке) Y будет равен 1.

Вот такая вот ситуация, интересно это баг или "так и задумано"?

PS Да конечно нужно использовать ящики (begin end), но синтаксис позволяет и не использовать

PSS Да конечно можете говорить что компилятор прав относя else ко второй проверке, но все же палка с двумя концами, так сказать...
В планах порабощение вселенной...
zumm вне форума Ответить с цитированием
Старый 05.08.2010, 13:14   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,830
По умолчанию

Есть стандарт, что гадать? Паскаль не Питон, где все решают пробелы.
p51x вне форума Ответить с цитированием
Старый 05.08.2010, 13:18   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
интересно это баг или "так и задумано"?
Допиши сверху y:=0;
Ты словил эффект-обманку, когда "y" у тебя ничем не инициализируется, и может содержать случайный мусор, вот тебе и показалось что от пробелов зависит исход, но Паскаль не F# в нем нет такого прикола. ты просто увидел последствия использования неинициализированных переменных. Вообще оптимизатор должен был бы вышвырнуть этот код, ибо он никогда не выполнится.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 05.08.2010, 13:42   #4
zumm
БохЪ
Форумчанин
 
Аватар для zumm
 
Регистрация: 30.09.2009
Сообщений: 724
По умолчанию

2Stilet, не, я знаю как надо, Y уже инициалзирован, присвоения X нет, да и условия выглядят совсем подругому в моем коде, я просто упростил то что нашел у себя Вопрос у меня в том, что почему всегда else относится к последнему изнутри условию. Ведь стандарты это просто отмазка, из синтаксиса можно явно судить что else может быть отнесен из логических правил к любому условию. Это недочет языка и нужно либо запртить неиспользовать в условиях ящики либо придумать другой подход.
В планах порабощение вселенной...
zumm вне форума Ответить с цитированием
Старый 05.08.2010, 13:52   #5
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

Цитата:
Вопрос у меня в том, что почему всегда else относится к последнему изнутри условию.
Думается что потому что:
Код:
x:=2;
if (x>2) And (x<4) then
  y:=1
else
  y:=2;
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 05.08.2010, 14:02   #6
mrChester
Я
Форумчанин
 
Аватар для mrChester
 
Регистрация: 24.04.2010
Сообщений: 693
По умолчанию

Цитата:
Вопрос у меня в том, что почему всегда else относится к последнему изнутри условию. Ведь стандарты это просто отмазка, из синтаксиса можно явно судить что else может быть отнесен из логических правил к любому условию. Это недочет языка и нужно либо запртить неиспользовать в условиях ящики либо придумать другой подход.
Это не отмазка а четкие правила синтаксиса. esle всегда будет относиться к последнему if и это не недостаток а преимущество. Хотите чтобы синтаксис обязывал использовать такие отступления?
Пример
Код:
x:=2; if x>2 then  if x<4 then y:=1 else y:=2;
даст такой же результат как и все остальные. А если вы хотите отнести else к первому if используйте блоки
Код:
x:=2; if x>2 then begin  if x<4 then y:=1 end else y:=2;
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©.
mrChester вне форума Ответить с цитированием
Старый 05.08.2010, 14:11   #7
Levsha100
Заблокирован
Старожил
 
Регистрация: 20.07.2008
Сообщений: 4,032
По умолчанию

if(){}else{} - красота
Levsha100 вне форума Ответить с цитированием
Старый 05.08.2010, 14:40   #8
Mixasik
New Delphi Coder
Форумчанин Подтвердите свой е-майл
 
Аватар для Mixasik
 
Регистрация: 20.07.2008
Сообщений: 874
По умолчанию

Все логично, что else относится к последнему ветвлению. Так и должно быть, а операторные скобки помогут.
p.s.
Levsha100, без обид, но так бы и влепил минус за вечный и не уместный пиар с++
Страх это слабость и потому, кто испугался уже побежден.
Mixasik вне форума Ответить с цитированием
Старый 05.08.2010, 14:52   #9
pproger
C++ hater
Старожил
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Mixasik
при чем тут с++? фигурные скобки используются во многих языках
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 05.08.2010, 14:54   #10
Mixasik
New Delphi Coder
Форумчанин Подтвердите свой е-майл
 
Аватар для Mixasik
 
Регистрация: 20.07.2008
Сообщений: 874
По умолчанию

pproger, просто не впервые у него вижу такое и догадываюсь о чем речь. Ладно не буду разводить баталии. А причем тут фигурные скобки?) - мог бы спросить я.
Страх это слабость и потому, кто испугался уже побежден.
Mixasik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
загадка NordKeeper Свободное общение 0 01.06.2010 18:45
загадка NordKeeper Помощь студентам 0 01.06.2010 18:36
Загадка Liones БД в Delphi 1 31.08.2009 12:33