Умножение с присваиванием: приветы Метаквотов и Метаквотам - страница 2

 
tara:

Описывал я уже эту "особенность". Разработчики не снизошли, а Mathemat выразил мнение, что это очень удобно и вполне естественно.

Механизм описан в учебнике, но не очень четко. Дело в том, что при разнотипных операндах сначала тип второго операнда приводится к первому, а уже после происходит все остальное. В Вашем примере double 0.5 -> int 0. Поэтому a*=b -> 0, так же, как a+=b -> 20. Думаю, более половины прикладного софта (пользовательского) содержит в себе эту ошибку, поскольку народ, в большинстве, не готов к подобным сюрпризам.

Это не удобно, не естественно и отличается от поведения в других языках, чем и опасно, т.к. пишешь по привычке вполне безобидные строчки, а получаешь фиг знает что. Тот факт, что в 5-ке это поменялось (по инфе МетаДрайвера, сам не проверял пока), подтверждает данную точку зрения и косвенно дает понять, что разработчики в 5-ке снизошли (хотя в 4-ке мы сами себе спасители утопающих). Сперва должно выполняться вычисление выражения (в данном случае эквивалент a * b, тип double), только затем оно приводится к типу приемной переменной int.

Это еще получается и привет тем, кто переносит 4-шные коды на 5-ку ;-).

 
VBAG:


Замечание, поддерживаю. Сам наступал не раз на грабли неявного приведения типов.

Может быть эта тема кому-то поможет и сбережет не один час драгоценного времени.

Столкнулся с чем-то подобным (сейчас уже не вспомню подробностей) при написании конструкции вида:

if(A > B || B > C) ...

в общем, теперь отдельные проверки всегда пишу в отдельных скобках. Ибо гадать как оно себя поведёт в очередной раз - не интересно. :(

Причина обращения: