Форум 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)

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, время: 02:48.

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