15.04.2009, 11:20 | #1 |
Участник
|
Будьте осторожны со сложными условиями
Неявное преобразование происходит не только из int в boolean, но и наоборот:
X++: int d= 10; boolean t= false; ; t= d == (5 || 10); // false t= d == (5 && 10); // false d= t; // 0 К стати первая строчка могла бы стать элегантной заменой этому: X++: t= (d == 5 || d == 10); // true
__________________
Dynamics AX 4.0.2501.122 SP2, kernel 4.0.2163.0, MS SQL 2005 |
|
15.04.2009, 11:24 | #2 |
Axapta
|
|
|
15.04.2009, 11:38 | #3 |
Участник
|
Получается, опять баго-фича
__________________
Dynamics AX 4.0.2501.122 SP2, kernel 4.0.2163.0, MS SQL 2005 |
|
15.04.2009, 11:39 | #4 |
Программатор
|
Если говорить про элегантность кода, то достаточно объявить
boolean t; и она по умолчанию будет false И не забываем ставить пробелы в нужных местах |
|
15.04.2009, 11:46 | #5 |
Axapta
|
|
|
15.04.2009, 12:22 | #6 |
Боец
|
Условия
X++: t= d == (5 || 10); // false X++: t= (d == 5 || d == 10); // true Во избежание получения результата, отличного от ожидаемого, в подобных случаях можно использовать более читабельные конструкции, например: X++: if (d == 5 || d == 10) t = true; Последний раз редактировалось DSPIC; 15.04.2009 в 12:27. |
|
15.04.2009, 12:27 | #7 |
Участник
|
X++: if( (a==10) || (a==25) || (b != c) // ... еше много похожих на эти строчки && (d < a) ) { // ... } Так вот в рабочем цейтноте можно сделать так: X++: if( a== 10 || (a== (b != c // ... еше много похожих на эти строчки && d < a) ) { // ... } Возьму свои слова обратно- на баго-фичу не тянет. Но про тонкость эту надо помнить.
__________________
Dynamics AX 4.0.2501.122 SP2, kernel 4.0.2163.0, MS SQL 2005 |
|
15.04.2009, 12:45 | #8 |
Участник
|
Цитата:
Сообщение от DSPIC
Условия
X++: t= d == (5 || 10); // false X++: t= (d == 5 || d == 10); // true Во избежание получения результата, отличного от ожидаемого, в подобных случаях можно использовать более читабельные конструкции, например: X++: if (d == 5 || d == 10) t = true; X++: t= d == (5 || 10); И назидательный тон ваш совсем не уместен, эти примеры я сам написал и поэтому хорошо знаю и понимаю что в них написано.
__________________
Dynamics AX 4.0.2501.122 SP2, kernel 4.0.2163.0, MS SQL 2005 Последний раз редактировалось cerbo; 15.04.2009 в 12:46. Причина: очепятка |
|
15.04.2009, 13:00 | #9 |
Участник
|
Цитата:
Это какая-то PHP-красота Лучше как в питогне X++: t = d in [5, 10] X++: boolean in(AnyType _value, container _container) { return conFind(_container, _value) ? true : false; } t = in(d, [5, 10]); А неявное преобразование сделано для проверки непутоты X++: if (table1.Qty1 || table1.Qty2) { .... } else { warning("No qty!!!") } |
|
15.04.2009, 13:04 | #10 |
Участник
|
Цитата:
t= d == (5 || 10); // false Если учесть преобразования boolean в int, 5 = 0101 а 10 = 1010. Соответственно сложив младшие биты получим 1 - значение в скобках будет true, далее сравниеваем этот 1 (приведенный из true в int) с 10 и получаем конечно же false во втором варианте происходит сравнение 2-х чисел int - конечно тут будет true, поскольку d == 10. Важно что выражение в скобках вернет приведенный к boolean результат! Если бы было так: X++: int c = 5 | 10; И в С++ тоже так!
__________________
http://www.axdevposts.blogspot.com Пришел, уведел.... отойди, дай другому увидеть! |
|
15.04.2009, 13:11 | #11 |
Участник
|
Да какая красота и элегантность?
Ну и какому числу должно быть равно булевское значение после преобразования в int? 1? 5? -1? "Элегантно" заглядывать в документацию каждый раз как встретишь (если это там вообще определено)? Надеятся, что в следующей версии компилятора эту "красоту" не испорятят? Для справки: 1. В С и С++ нет булевского типа. Есть понятие "0 "и "не 0", со всеми вытекающими. 2. В Java такие трюки вообще запрещены. И правильно. В одном вы правы - надо быть осторожней и НЕ использовать такие финты. |
|
15.04.2009, 13:42 | #12 |
Боец
|
|
|
15.04.2009, 14:06 | #13 |
Участник
|
А зачем тогда нужно из boolean в int?
__________________
Dynamics AX 4.0.2501.122 SP2, kernel 4.0.2163.0, MS SQL 2005 |
|
15.04.2009, 14:41 | #14 |
Участник
|
|
|
15.04.2009, 15:11 | #15 |
Участник
|
Цитата:
Соответсвенно в аксапте на самом деле true преобразовывается в 1, а false в 0. Поэтому собственно код автора выдавал false, ибо 10 не равно 1. Лично я всё равно избегаю таких неявных преобразований ибо от лукавого |
|
15.04.2009, 16:11 | #16 |
Участник
|
Для справки, в C++ есть тип bool
__________________
Dynamics AX 4.0.2501.122 SP2, kernel 4.0.2163.0, MS SQL 2005 |
|
15.04.2009, 16:21 | #17 |
Axapta
|
|
|
15.04.2009, 16:45 | #18 |
Участник
|
Точно, был не прав. В C++ есть, в C нет.
Цитата:
Кстати нашёл в wiki как boolean реализуется в разных языках. |
|
15.04.2009, 17:35 | #19 |
Участник
|
в принципе, автоконфертация AnyType -> bool полезна - оня является отражением соглашения про то что некоторые значения - null.
bool -> int, я думаю, вредна. Надо просто сделать bool отдельным типом от enum и сделать автоконыертацию строго для NoYes |
|
Теги |
неявное преобразование |
|
Похожие темы | ||||
Тема | Ответов | |||
Будьте осторожны с RecordInsertList | 6 | |||
баг в 2.5. Будьте осторожнее с символом "_" подчеркивание | 5 | |||
Заказы-склад комплектация | 2 | |||
И еще раз о слоях | 2 |
Опции темы | Поиск в этой теме |
Опции просмотра | |
|