Начинаю понимать
почему я нелюблю джаву не зная даже её синтаксиса. Это, видать до меня флюиды доходят.
Читаю документацию. Еще даже ни до чего серьёзного не дошёл, а уже два прекрасных момента.
1. Юникод в комментариях.
не скомпилируется.
2. Разница между && и & для boolean. Это вобще за гранью добра и зла - умудриться вырыть такую западню на ровном месте.
В этом случае программа напечатает test1 и false. А если && заменить на &, то напечатает test1, test2 и false. Здравствуй поиск непонятной ошибки из-за тривиальной опечатки.
Читаю документацию. Еще даже ни до чего серьёзного не дошёл, а уже два прекрасных момента.
1. Юникод в комментариях.
\\ c:\user\ufmне скомпилируется.
2. Разница между && и & для boolean. Это вобще за гранью добра и зла - умудриться вырыть такую западню на ровном месте.
static boolean test1() {
System.out.println("test1");
return false;
}
static boolean test2() {
System.out.println("test2");
return false;
}
public static void main(String[] args) {
System.out.println(test1() && test2());
}
В этом случае программа напечатает test1 и false. А если && заменить на &, то напечатает test1, test2 и false. Здравствуй поиск непонятной ошибки из-за тривиальной опечатки.
no subject
no subject
Впрочем - на счёт засадыс комментарием я сомневаюсь, а проверять - лень.
no subject
Дело в том, что для логических && действует оптимизация, и если оптимизатор видит, что дальше считать нет смысла - он дальше и не считает. Это позволяет не вызывать некоторые функции, которые могут работать долго. Грубо говоря, у вас в test2 может быть цела куча кода, который надо исполнять, чтобы получить результат.
В простом случае "для теста" вы туда можете поставить sleep (но sleep не грузит проц, хотя и выдерживает паузу).
Для побитовых операций побитовые И, ИЛИ, И-НЕ выполняются для каждого бита. И это выполняется одной командой процессора над регистрами соответствующей битности.
И суть в том, что если такую же оптимизацию, которая действует для логических операций, применить для побитовых, то это придется программно проверять каждый бит, и если хоть 1 не совпал - то такую оптимизацию отменять. Раз в 100 это замедлит код точно.
А что было бы, если бы так как вам хочется было только для типа boolean, а для остальных типов было бы так, как есть сейчас? Наверное, так сделать можно бы было - но это было бы нелогично. Это дополнительное правило, которое надо бы было помнить. Вообще, это не аргумент, конечно. Разработчиков не остановила логика, что System.out.println('\u002a') можно - а System.out.println('\u000a') нельзя. Вот это действительно бред.
Так что думаю, обозначенная особенность не должна вас вообще волновать.
no subject
Честно, я не вижу юзкейса для побитовых операций у boolean.
Зачем побитовые операции у других типов и почему они себя ведут так как ведут - объяснения не требует.
Впрочем, понятно что "поздняк метаццо", никто не будет это менять. Это надо было думать при проектировании языка.
no subject
Да, согласен. Это надо было запретить.
no subject
no subject
Подлянка с & и && для boolean состоит в том, что обе операции дают _одинаковый_ _правильный_ результат. Но с разными побочными эффектами. На которые можно нарваться, а можно - не нарваться. А можно нарваться сильно позже совершенно не ожидая этого.
no subject
Где-то ошибка вылезает, когда вместо одного знака ставят два. Где-то когда вместо запятой точку. Где-то когда плюс путают с минусом.
Если где-то в формуле будет за плюсом почти всегда 0, то тоже "А можно нарваться сильно позже совершенно не ожидая этого."
no subject
Кстати, в go догадались для boolean не делать операцию &.