Баг или фича?

Раздел посвящен программированию с использованием Power Basic.
jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Баг или фича?

Сообщение jangle » 02.08.2011 (Вт) 10:35

Код: Выделить всё
#Compile Exe
#Dim All

Function PBMain () As Long
Local y As Long ,z As Long
y=z=1
MsgBox Str$(y)
End Function
                                 


В PBWin 9.04 выдается 0

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Баг или фича?

Сообщение Хакер » 02.08.2011 (Вт) 12:03

А что должно выдаваться?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Баг или фича?

Сообщение jangle » 02.08.2011 (Вт) 12:19

Хакер писал(а):А что должно выдаваться?


1 скорее всего

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Баг или фича?

Сообщение Хакер » 02.08.2011 (Вт) 13:12

Ну второе «равно» ведь работает оператором сравнения.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Баг или фича?

Сообщение jangle » 02.08.2011 (Вт) 13:20

Хакер писал(а):Ну второе «равно» ведь работает оператором сравнения.


Тогда компилятор должен ругаться на отсутствие IF.
А так получается, что он проглатывает это выражение и пользователь может решить что в PB работает многократное сишное присвоение: a=b=c=d=r=100;

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Баг или фича?

Сообщение Хакер » 02.08.2011 (Вт) 14:59

jangle писал(а):Тогда компилятор должен ругаться на отсутствие IF.

В каком месте?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Баг или фича?

Сообщение jangle » 02.08.2011 (Вт) 15:17

Вот тут:
Код: Выделить всё
y=z=1


Это же бейсик, а значит эта конструкция должна выглядеть так:

Код: Выделить всё
If  z = 1  Then y=z=1     


Иначе можно очень просто запутаться

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Баг или фича?

Сообщение Хакер » 02.08.2011 (Вт) 15:20

jangle писал(а):Это же бейсик, а значит эта конструкция должна выглядеть так:

С чего бы ради?

y=z=1 эквивалентно Let y = (z=1) эквивалентно сишному y = z==1 эквивалентно паскалевскому y := z = 1.

Вот такая y = z <> 2 тебя меньше смущает?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Баг или фича?

Сообщение jangle » 02.08.2011 (Вт) 15:28

Хакер писал(а):
jangle писал(а):Это же бейсик, а значит эта конструкция должна выглядеть так:

С чего бы ради?

y=z=1 эквивалентно Let y = (z=1) эквивалентно сишному y = z==1 эквивалентно паскалевскому y := z = 1.

Вот такая y = z <> 2 тебя меньше смущает?


Меня смущает, что есть прекрасная особенность в Си-подобных языках, которой нет в Basic и нет в Паскале. Это возможность совместить несколько операторов "присвоения" в одном операторе. Например строка
Код: Выделить всё
y=z=1
присвоит переменным y и z значение 1. Это более логично и правильно.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Баг или фича?

Сообщение Хакер » 02.08.2011 (Вт) 15:32

jangle писал(а):Это более логично и правильно.

За это приходится платить тем, что для присвоения используют =, а для сравнения ==. Или в паскале — для присвоения :=, а для сравнения — =.

В бейсиках сравнение и присвоение обозначается одним «символом». Изначально было так: = — это всегда сравнение, за исключением случая, когда оно стоит после Let. Чуть позже Let стал опциональным, и стало так: = — это всегда сравнение, за исключением случая, когда оно стоит в Let или LSet или RSet или Set с учётом того, что Let может быть опущен.

Так что это фича, причём крайне старая.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

spamjokester
Начинающий
Начинающий
 
Сообщения: 18
Зарегистрирован: 13.08.2011 (Сб) 20:09

Re: Баг или фича?

Сообщение spamjokester » 14.08.2011 (Вс) 19:07

'А что должно выдаваться?
'1 скорее всего
y=z=1
По моему, возможность одновременного присвоения не очень существенна для BASIC,пусть он и дальше будет BASIC а не С.
Но тут с точки зрения BASIC,идет речь о возможности логического сравнения (True\False)
Т.е. выполняется условие False (z не равно единице). А условие False означает 0,в противном случае это <> 0 (-1 вероятно).
Это нужно для того,чтобы можно было иногда сократить код или,когда точное значение нас не интересует,а условие да.

Например:
x=10
y=100
J
if x<y then ... J=5
А можно:
J=(x<y)*-5
Интересно,что по моему скорости в VB60 это не добавляет,а в PW мне не известно ?

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 14.08.2011 (Вс) 22:12

spamjokester писал(а):Интересно,что по моему скорости в VB60 это не добавляет

Было бы странно, если бы от замены перехода на умножение скорость увеличивалась :)


Вернуться в Power Basic

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9

    TopList  
cron