Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Странное поведение Boolean (http://www.flasher.ru/forum/showthread.php?t=214022)

Bletraut 28.03.2017 18:17

Странное поведение Boolean
 
Почему не работает

Код AS3:

trace(true * 2); //Error: Implicit coercion of a value of type Boolean to an unrelated type Number.

Однако, исправно работает

Код AS3:

trace(true + 2); // 3

В джаве, например, не работает ни одна из конструкций. В питоне работают обе, но в ас3 только одна, почему?

Tails 28.03.2017 19:03

Лучше всегда избегать неявного преобразования типов по разным соображениям. (Качество и безопасность кода, скорость выполнения.)

Wolsh 28.03.2017 20:27

"+" — более сложный генерик, допускающий разнообразие типов, например при сложении строк. Умножение строк допустимо? )))

Bletraut 29.03.2017 00:47

Цитата:

Сообщение от Wolsh (Сообщение 1199898)
"+" — более сложный генерик, допускающий разнообразие типов, например при сложении строк. Умножение строк допустимо? )))

Почему тогда в джаве не работает?

Добавлено через 36 секунд
Да и к тому же получается на 12 как если бы мы складывали строки, а число 3.

СлаваRa 29.03.2017 10:13

Код:

Почему тогда в джаве не работает?
Чтобы вам еще интереснее было

в CLisp-e (+ t 2) +: T is not a number, ( * t 2) : T is not a numbe
в python True * 2 == 2, True + 2 == 3
в js true * 2 == 2 и true + 2 == 3
Erlang
3> true + 2.
** exception error: an error occurred when evaluating an arithmetic expression
in operator +/2
called as true + 2
4> true * 2.
** exception error: an error occurred when evaluating an arithmetic expression
in operator */2
called as true * 2
в haxe - не скомпилирует
c++11 true * 2 == 2, true + 2 == 3
c# - не скомпилируется
rust - не скомпилируется

UPD
Код:

Bash

$ echo $((TRUE+2))
2
$ echo $((TRUE*2))
0


Bletraut 29.03.2017 16:03

Цитата:

Сообщение от СлаваRa (Сообщение 1199906)
Код:

Почему тогда в джаве не работает?
Чтобы вам еще интереснее было

в CLisp-e (+ t 2) +: T is not a number, ( * t 2) : T is not a numbe
в python True * 2 == 2, True + 2 == 3
в js true * 2 == 2 и true + 2 == 3
Erlang
3> true + 2.
** exception error: an error occurred when evaluating an arithmetic expression
in operator +/2
called as true + 2
4> true * 2.
** exception error: an error occurred when evaluating an arithmetic expression
in operator */2
called as true * 2
в haxe - не скомпилирует
c++11 true * 2 == 2, true + 2 == 3
c# - не скомпилируется
rust - не скомпилируется

UPD
Код:

Bash

$ echo $((TRUE+2))
2
$ echo $((TRUE*2))
0


А я о чём и говорю, что в строготипизированных языках не работает как + так и *. Однако, в ас3 работает +.

СлаваRa 29.03.2017 16:16

Цитата:

А я о чём и говорю, что в строготипизированных языках не работает как + так и *. Однако, в ас3 работает +.
c++ строготипизированный язык?

ЗЫ
Зачем работая с as3 вы сравниваете что-то с другими языками, когда вы с ними в данный момент не работаете? почитайте про приведение типов в ас3, посмотрите на оператор +, подумайте, все встанет на свои места

callme 29.03.2017 17:20

СлаваRa, ну что вы в загадки то играете. Лучше объясните по какой логике разработчики языка разрешили неявное приведение булева типа к числу для сложения, но не разрешили для умножения. Уверен можно уложиться в одно предложение.

СлаваRa 29.03.2017 17:50

оператор + перегружен(на уровне VM), как минимум, для конкатенации строк, скорее всего(уверен в этом на 146%), приведение типа срабатывает в зависимости от каких-то условий, т.е. при использовании + для конкатенации? происходит преобразование в строку, если один из операндов строка, видимо при использовании операции сложения bool и int первый из-за автокаста преобразуется в ближайшее подходящее, т.е. в int(1), оператор * используется только для умножения числовых типов и не имеет иных предназначений, поэтому никаких преобразований операндов не происходит.

Bletraut 29.03.2017 18:31

Код AS3:

trace(true + false); // 1
trace(true + "abc"); // trueabs
trace(true + 2 + "abc"); // 3abc

Добавлено через 6 минут
Цитата:

Сообщение от СлаваRa (Сообщение 1199920)
оператор + перегружен(на уровне VM), как минимум, для конкатенации строк, скорее всего(уверен в этом на 146%), приведение типа срабатывает в зависимости от каких-то условий, т.е. при использовании + для конкатенации? происходит преобразование в строку, если один из операндов строка, видимо при использовании операции сложения bool и int первый из-за автокаста преобразуется в ближайшее подходящее, т.е. в int(1), оператор * используется только для умножения числовых типов и не имеет иных предназначений, поэтому никаких преобразований операндов не происходит.

А в той же джаве разве оператор + не перегружен?


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

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