Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Огромный идиотский минус AVM1 в логике (http://www.flasher.ru/forum/showthread.php?t=140079)

camelot 19.05.2010 18:09

Огромный идиотский минус AVM1 в логике
 
Код AS1/AS2:

trace( NaN == 0 );
trace( NaN < 0 );
trace( NaN > 0 );
trace( NaN >= 0 );
trace( NaN <= 0 );
 
trace("result:" + ((NaN >= 0) == (NaN > 0 || NaN == 0))  );

Очень многим людям это должно послужить очень хорошим уроком.
Это просто гиганский маразм адоба в логике или баг среды выполнения.
компилил в mtasc и в cs4. дебаг плеер 10
на поиск этого маразма потратил 6 часов. пришлось огромный проект на запчасти разбирать


з.ы. или я где-то и чего то не понимаю?

Psycho Tiger 19.05.2010 18:49

Nan >=0 - true.
Nan > 0 - undefined (false)
Nan == 0 - false

true == (false || false) ? false.

А вот сравнения NaNов и правда забавны.

camelot 20.05.2010 01:30

по логике, выражиние:
((NaN >= 0) == (NaN > 0 || NaN == 0)
должно быть:
false == (false || false) ? true

silin 20.05.2010 14:41

имо минус изначально в попытке сравнивать теплое с мягким

строку или мувиклип с нулем сравнивать не пробовали ?
ужасно нелогичные реультаты выдает

Psycho Tiger 20.05.2010 19:36

У меня NaN>=0 Flash 8 распознал как true.

camelot 25.05.2010 14:38

Цитата:

Сообщение от silin (Сообщение 909578)
имо минус изначально в попытке сравнивать теплое с мягким

строку или мувиклип с нулем сравнивать не пробовали ?
ужасно нелогичные реультаты выдает

Код AS1/AS2:

trace( _root == 0 ); //false
trace( _root < 0 ); // undefined (false)
trace( _root > 0 ); // undefined (false)
trace( _root >= 0 ); // true
trace( _root <= 0 ); // true
 
trace( "ABC" == 0 ); // false
trace( "ABC" < 0 ); // undefined (false)
trace( "ABC" > 0 ); // undefined (false)
trace( "ABC" >= 0 ); // undefined (false)
trace( "ABC" <= 0 ); // undefined (false)
 
trace( _root._visible == 0 ); // false
trace( _root._visible < 0 ); // false
trace( _root._visible > 0 ); // true
trace( _root._visible >= 0 ); // true
trace( _root._visible <= 0 ); // false
 
trace({} == 0 ); // false
trace({} < 0 ); // false
trace({} > 0 ); // false
trace({} >= 0 ); // true
trace({} <= 0 ); // true

я конешно понимаю что вы один из лучших флешеров рунета а может быть всей земли.
я так же понимаю что сравнивается тёплое или мягкое с цифрой. но должна же быть система логики. почему логика стринга отличается от логики мувиклипа или логики НеЦифры ?

iNils 25.05.2010 14:55

Какие моменты вас конкретно не устраивают?

Psycho Tiger 26.05.2010 15:52

Призадумался.
Код:

trace( _root == 0 ); //false OK
trace( _root < 0 ); // undefined (false) OK
trace( _root > 0 ); // undefined (false) OK
trace( _root >= 0 ); // true _root > 0 || _root ==0 - undefined || false - не очень ок


iNils 26.05.2010 16:12

Код:

trace( _root >= 0 ); // true _root > 0 || _root ==0 - undefined || false - не очень ок
Операция >= состоит из двух действий greaterThan и not, в рузльтате greaterThan дает undefined, а отрицания undefined дает true.

camelot 26.05.2010 16:45

Цитата:

Сообщение от iNils (Сообщение 911071)
Код:

trace( _root >= 0 ); // true _root > 0 || _root ==0 - undefined || false - не очень ок
Операция >= состоит из двух действий greaterThan и not, в рузльтате greaterThan дает undefined, а отрицания undefined дает true.

а как вы объясните ?

Код AS1/AS2:

trace( "ABC" == 0 ); // false
trace( "ABC" < 0 ); // undefined (false)
trace( "ABC" > 0 ); // undefined (false)
trace( "ABC" >= 0 ); // undefined (false)
trace( "ABC" <= 0 ); // undefined (false)

greaterThan даёт undefined ?
а отрициание undefiened в данном конкретном случае даёт false?

silin 26.05.2010 17:06

mtasc выдает
Код AS1/AS2:

trace( "ABC" == 0 ); // false
trace( "ABC" < 0 ); // undefined
trace( "ABC" > 0 ); // undefined
trace( "ABC" >= 0 ); // true
trace( "ABC" <= 0 ); // true

т.е. все как iNils сказал

IDE-шный компилятор для >= и <= дает тоже undefined (т.е. невыполнимость опреации, а вовсе не false),
можно предположить, что выполнение прерывается на стадии lt/gt без выполнения not

iNils 26.05.2010 17:17

Если посмотреть на байткод который выдал компилятор ide
Код:

push FALSE

push UNDEF

push UNDEF

push UNDEF

push UNDEF

то видно, что на стадии компиляции произошло сравнение с данными и был записан уже результат, то есть была оптимизация кода.
Вот если бы вы написали
Код AS1/AS2:

var s:String = "ABC"
trace( s == 0 ); // false
trace( s < 0 ); // undefined
trace( s > 0 ); // undefined
trace( s >= 0 ); // true
trace( s <= 0 ); // true

то и результат был бы другой.

Psycho Tiger 26.05.2010 17:27

Цитата:

Сообщение от iNils (Сообщение 911071)
Код:

trace( _root >= 0 ); // true _root > 0 || _root ==0 - undefined || false - не очень ок
Операция >= состоит из двух действий greaterThan и not, в рузльтате greaterThan дает undefined, а отрицания undefined дает true.

Ага, понятно. Ну вот тут то и косяк, мой вариант разложения по логике должен давать тот же результат, что и твой. Конечно, не стоит сравнивать тёплое с мягким, но один фиг - расходится.

AzagThoth 27.05.2010 12:42

Чем не устраивает isNaN
Зачем городить сравнения вообще.

camelot 28.05.2010 17:56

Цитата:

Сообщение от AzagThoth (Сообщение 911289)
Чем не устраивает isNaN
Зачем городить сравнения вообще.

вот вы везде везде где у вас переменная Number прежде чем её использовать вы проверяете её isNaN и ещё наверное проверяет её тип typeof и чтобы быть 100% увереным ещё и instanceof Number и чтобы добить до конца parseInt, да?

бывает случаи когда переменная не инициализирована или другого типа и получается так, что это приводит к очень печальным последствиям.
например при восходящем или нисходящем приведении типа когда ссылка на мувиклип или объект превращается в undefiened или null. а если вы ещё и работаете с динамическими данными и трудно поймать такое условие - вам будет стоить громадных усилий и времени поймать в чем проблема.

например:

Код AS1/AS2:

class A
{
  public var testVar:Number = 10;
}
 
var mc:MovieClip = attachMovie("AfromLibrary", "instanceOfA", 0); // или createEmptyMovieClip("instanceOfA", 0) - кому как нравится
mc.__proto__ = A.prototype;
var instA:A = A(mc);
var resultValue:Number = instA.testVar + 10;
if (resultValue:Number >= 0 )
{
  trace("all ok");
}
else
{
  unloadMovie(_level0);
}

а всего то ошибка class A extends MovieClip.
в результате cтроки:
Код AS1/AS2:

var instA:A = A(mc); //instA = null
var resultValue:Number = instA.testVar + 10; // resultValue = NaN
if (resultValue >= 0 ) // читайте выше, что даёт NaN >= 0



з.ю. ради бога, не придирайтесь к примеру. выдумал по быстрому

iNils 28.05.2010 18:03

Смысла ругать avm1 уже нет, ее развитие остановлено. А AS3 существует уже не первый год.


Часовой пояс GMT +4, время: 13:34.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.