Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 28.03.2017, 18:17
Bletraut вне форума Посмотреть профиль Отправить личное сообщение для Bletraut Найти все сообщения от Bletraut
  № 1  
Ответить с цитированием
Bletraut
 
Аватар для Bletraut

Регистрация: Mar 2013
Адрес: Вне пространства.
Сообщений: 566
Отправить сообщение для Bletraut с помощью ICQ Отправить сообщение для Bletraut с помощью Skype™
Attention Странное поведение 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 только одна, почему?
__________________
Я заклинаю вас действовать иначе.

Старый 28.03.2017, 19:03
Tails вне форума Посмотреть профиль Отправить личное сообщение для Tails Найти все сообщения от Tails
  № 2  
Ответить с цитированием
Tails
 
Аватар для Tails

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
Лучше всегда избегать неявного преобразования типов по разным соображениям. (Качество и безопасность кода, скорость выполнения.)
__________________
Дети не должны знать о своих родителях

Старый 28.03.2017, 20:27
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 3  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
"+" — более сложный генерик, допускающий разнообразие типов, например при сложении строк. Умножение строк допустимо? )))
__________________
Reality.getBounds(this);

Старый 29.03.2017, 00:47
Bletraut вне форума Посмотреть профиль Отправить личное сообщение для Bletraut Найти все сообщения от Bletraut
  № 4  
Ответить с цитированием
Bletraut
 
Аватар для Bletraut

Регистрация: Mar 2013
Адрес: Вне пространства.
Сообщений: 566
Отправить сообщение для Bletraut с помощью ICQ Отправить сообщение для Bletraut с помощью Skype™
Цитата:
Сообщение от Wolsh Посмотреть сообщение
"+" — более сложный генерик, допускающий разнообразие типов, например при сложении строк. Умножение строк допустимо? )))
Почему тогда в джаве не работает?

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

Старый 29.03.2017, 10:13
СлаваRa вне форума Посмотреть профиль Отправить личное сообщение для СлаваRa Найти все сообщения от СлаваRa
  № 5  
Ответить с цитированием
СлаваRa
 
Аватар для СлаваRa

блогер
Регистрация: Feb 2008
Адрес: http://playtika.com
Сообщений: 1,119
Записей в блоге: 5
Отправить сообщение для СлаваRa с помощью ICQ Отправить сообщение для СлаваRa с помощью Skype™
Код:
Почему тогда в джаве не работает?
Чтобы вам еще интереснее было

в 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
__________________
местонахождение


Последний раз редактировалось СлаваRa; 29.03.2017 в 10:26.
Старый 29.03.2017, 16:03
Bletraut вне форума Посмотреть профиль Отправить личное сообщение для Bletraut Найти все сообщения от Bletraut
  № 6  
Ответить с цитированием
Bletraut
 
Аватар для Bletraut

Регистрация: Mar 2013
Адрес: Вне пространства.
Сообщений: 566
Отправить сообщение для Bletraut с помощью ICQ Отправить сообщение для Bletraut с помощью Skype™
Цитата:
Сообщение от СлаваRa Посмотреть сообщение
Код:
Почему тогда в джаве не работает?
Чтобы вам еще интереснее было

в 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 работает +.
__________________
Я заклинаю вас действовать иначе.

Старый 29.03.2017, 16:16
СлаваRa вне форума Посмотреть профиль Отправить личное сообщение для СлаваRa Найти все сообщения от СлаваRa
  № 7  
Ответить с цитированием
СлаваRa
 
Аватар для СлаваRa

блогер
Регистрация: Feb 2008
Адрес: http://playtika.com
Сообщений: 1,119
Записей в блоге: 5
Отправить сообщение для СлаваRa с помощью ICQ Отправить сообщение для СлаваRa с помощью Skype™
Цитата:
А я о чём и говорю, что в строготипизированных языках не работает как + так и *. Однако, в ас3 работает +.
c++ строготипизированный язык?

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

Старый 29.03.2017, 17:20
callme вне форума Посмотреть профиль Отправить личное сообщение для callme Найти все сообщения от callme
  № 8  
Ответить с цитированием
callme
 
Аватар для callme

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

Старый 29.03.2017, 17:50
СлаваRa вне форума Посмотреть профиль Отправить личное сообщение для СлаваRa Найти все сообщения от СлаваRa
  № 9  
Ответить с цитированием
СлаваRa
 
Аватар для СлаваRa

блогер
Регистрация: Feb 2008
Адрес: http://playtika.com
Сообщений: 1,119
Записей в блоге: 5
Отправить сообщение для СлаваRa с помощью ICQ Отправить сообщение для СлаваRa с помощью Skype™
оператор + перегружен(на уровне VM), как минимум, для конкатенации строк, скорее всего(уверен в этом на 146%), приведение типа срабатывает в зависимости от каких-то условий, т.е. при использовании + для конкатенации? происходит преобразование в строку, если один из операндов строка, видимо при использовании операции сложения bool и int первый из-за автокаста преобразуется в ближайшее подходящее, т.е. в int(1), оператор * используется только для умножения числовых типов и не имеет иных предназначений, поэтому никаких преобразований операндов не происходит.
__________________
местонахождение

Старый 29.03.2017, 18:31
Bletraut вне форума Посмотреть профиль Отправить личное сообщение для Bletraut Найти все сообщения от Bletraut
  № 10  
Ответить с цитированием
Bletraut
 
Аватар для Bletraut

Регистрация: Mar 2013
Адрес: Вне пространства.
Сообщений: 566
Отправить сообщение для Bletraut с помощью ICQ Отправить сообщение для Bletraut с помощью Skype™
Код AS3:
trace(true + false); // 1
trace(true + "abc"); // trueabs
trace(true + 2 + "abc"); // 3abc
Добавлено через 6 минут
Цитата:
Сообщение от СлаваRa Посмотреть сообщение
оператор + перегружен(на уровне VM), как минимум, для конкатенации строк, скорее всего(уверен в этом на 146%), приведение типа срабатывает в зависимости от каких-то условий, т.е. при использовании + для конкатенации? происходит преобразование в строку, если один из операндов строка, видимо при использовании операции сложения bool и int первый из-за автокаста преобразуется в ближайшее подходящее, т.е. в int(1), оператор * используется только для умножения числовых типов и не имеет иных предназначений, поэтому никаких преобразований операндов не происходит.
А в той же джаве разве оператор + не перегружен?
__________________
Я заклинаю вас действовать иначе.

Создать новую тему Ответ Часовой пояс GMT +4, время: 20:03.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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