Начинаю понимать
2017-07-04 14:47почему я нелюблю джаву не зная даже её синтаксиса. Это, видать до меня флюиды доходят.
Читаю документацию. Еще даже ни до чего серьёзного не дошёл, а уже два прекрасных момента.
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)
Date: 2017-07-04 15:29 (UTC)(no subject)
Date: 2017-07-04 15:55 (UTC)Впрочем - на счёт засадыс комментарием я сомневаюсь, а проверять - лень.
(no subject)
Date: 2017-07-04 18:19 (UTC)Дело в том, что для логических && действует оптимизация, и если оптимизатор видит, что дальше считать нет смысла - он дальше и не считает. Это позволяет не вызывать некоторые функции, которые могут работать долго. Грубо говоря, у вас в test2 может быть цела куча кода, который надо исполнять, чтобы получить результат.
В простом случае "для теста" вы туда можете поставить sleep (но sleep не грузит проц, хотя и выдерживает паузу).
Для побитовых операций побитовые И, ИЛИ, И-НЕ выполняются для каждого бита. И это выполняется одной командой процессора над регистрами соответствующей битности.
И суть в том, что если такую же оптимизацию, которая действует для логических операций, применить для побитовых, то это придется программно проверять каждый бит, и если хоть 1 не совпал - то такую оптимизацию отменять. Раз в 100 это замедлит код точно.
А что было бы, если бы так как вам хочется было только для типа boolean, а для остальных типов было бы так, как есть сейчас? Наверное, так сделать можно бы было - но это было бы нелогично. Это дополнительное правило, которое надо бы было помнить. Вообще, это не аргумент, конечно. Разработчиков не остановила логика, что System.out.println('\u002a') можно - а System.out.println('\u000a') нельзя. Вот это действительно бред.
Так что думаю, обозначенная особенность не должна вас вообще волновать.
(no subject)
Date: 2017-07-04 19:28 (UTC)Честно, я не вижу юзкейса для побитовых операций у boolean.
Зачем побитовые операции у других типов и почему они себя ведут так как ведут - объяснения не требует.
Впрочем, понятно что "поздняк метаццо", никто не будет это менять. Это надо было думать при проектировании языка.
(no subject)
Date: 2017-07-05 11:33 (UTC)Да, согласен. Это надо было запретить.
(no subject)
Date: 2017-07-04 19:27 (UTC)(no subject)
Date: 2017-07-04 19:35 (UTC)Подлянка с & и && для boolean состоит в том, что обе операции дают _одинаковый_ _правильный_ результат. Но с разными побочными эффектами. На которые можно нарваться, а можно - не нарваться. А можно нарваться сильно позже совершенно не ожидая этого.
(no subject)
Date: 2017-07-04 19:38 (UTC)Где-то ошибка вылезает, когда вместо одного знака ставят два. Где-то когда вместо запятой точку. Где-то когда плюс путают с минусом.
Если где-то в формуле будет за плюсом почти всегда 0, то тоже "А можно нарваться сильно позже совершенно не ожидая этого."
(no subject)
Date: 2017-07-04 19:44 (UTC)Кстати, в go догадались для boolean не делать операцию &.