Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   /= и > приоритеты? (http://www.flasher.ru/forum/showthread.php?t=139026)

wvxvw 21.04.2010 20:34

/= и > приоритеты?
 
Я тут немного в недоумении, просветите пожалуйста, это в других языках тоже так, или это только AS3 отличился:

Код AS3:

var n:Number = 123456789;
var ret:int = 1;
while ((n /= 10) > 1) ret++;
trace(ret);

Подсчитывает длину.

Код AS3:

var n:Number = 123456789;
var ret:int = 1;
while (n /= 10 > 1) ret++;
trace(ret);

Бесконечный цикл (сравнение выполняется до присвоения).

Psycho Tiger 21.04.2010 21:43

Ради интереса провёл тест в AVM1 - не компилирует
Код AS3:

var n:Number = 123456789;
var ret:Number = 1;
while (n /= 10 > 1) ret++;
trace(ret);

Цитата:

**Error** Scene=Scene 1, layer=Layer 1, frame=1:Line 3: Type mismatch in assignment statement: found Boolean where Number is required.
while (n /= 10 > 1) ret++;

Total ActionScript Errors: 1 Reported Errors: 1
AVM2:
Код AS1/AS2:

trace(n /= 10 > 1); //123456789, а не Boolean, как ожидалось

Добавлено через 1 минуту
Вот так скобки фп расставляет:
Код AS3:

n /= (10 > 1)

В итоге
Код AS3:

n /= true
n /= 1
n

Хотя не думаю, что ты не догадался об этом. А в чем вопрос, собственно?

udaaff 21.04.2010 21:52

wvxvw, по-моему, вполне логично, что операторы присвоения имеют более низкий приоритет перед другими операторами (за исключением , ). Или в чем недоумение заключается? :)

lowka 21.04.2010 21:54

Вообще это не должно компилироваться из-за того, что для нет операции деления для числа и Boolean.

orcpochta 21.04.2010 21:57

Цитата:

Сообщение от lowka (Сообщение 902284)
Вообще это не должно компилироваться из-за того, что для нет операции деления для числа и Boolean.

зато есть такое понятие, как приведение типов))

silin 21.04.2010 22:03

да вроде бы и нет противоречия:
/= присваивает результат от деления на то то, что ему дали, а во втором пример ты ему даешь 1 (10 > 1)
зы: результат излишней дружественности AS в части приведения типов

Добавлено через 5 минут
ззы: кому эти скобки мешали?, имо надо их всегда писать, да и читать проще

wvxvw 21.04.2010 22:37

Дада, а вот только инкремент / декремент, которые являются все теми же операциями присвоения работают как раз по-другому ;)

lowka:
Выражение внутри while() кастуется к Boolean в любом случае. Вопрос бы о другом, почему операция деления и присвоения ведет себя не так, как операция прибавления и присвоения, например.

Xero201 21.04.2010 23:16

Цитата:

Сообщение от wvxvw (Сообщение 902294)
Дада, а вот только инкремент / декремент, которые являются все теми же операциями присвоения работают как раз по-другому ;)

lowka:
Выражение внутри while() кастуется к Boolean в любом случае. Вопрос бы о другом, почему операция деления и присвоения ведет себя не так, как операция прибавления и присвоения, например.

инкремент / декремент - унарные операции (в отличие от тех же += и -=)
Код AS3:

while ((n /= 10) > 1) { ret+=10>1;}
trace(ret);

вот)

lowka 21.04.2010 23:25

вообще-то они одинаково себя ведут.
a += b + c есть a += (b + c), что есть (a + b) +c, что тождественно a + b + c , а для умножения/деления a*=b + c есть a *= (b + c) что есть a*(b + c), а это есть a*b + b*c.

Psycho Tiger 22.04.2010 10:39

lowka, откомпилируйте 2 кода что привел автор и поймёте, что не одинаково.


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

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