Jednym z powodów, dla których możesz chcieć użyć operatora, który nie działa w zwarciu, jest sytuacja, w której w jakiś sposób zależy od skutków ubocznych funkcji. Na przykład.
boolean isBig(String text) {
System.out.println(text);
return text.length() > 10;
}
...
if(isBig(string1) || isBig(string2)){
...
}
Jeśli nie dbam o to, czy println
jest wykonywany wtedy trzeba zastosować krótkie operacje obwodu jak wyżej. Jeśli jednak chcesz, aby oba łańcuchy były drukowane zawsze (a więc w zależności od efektów ubocznych), musisz użyć operatora, który nie działa w zwarciu.
Praktycznie mówiąc, prawie zawsze chcesz używać operatorów zwarć. Opieranie się na efektach ubocznych w wyrażeniach jest zwykle złą praktyką programistyczną.
Jeden wyjątek dotyczy kodu bardzo niskiego poziomu lub kodu wrażliwego na wydajność. Operatory zwarcia mogą być nieco wolniejsze, ponieważ powodują rozgałęzienia podczas wykonywania programu. Również użycie operatorów bitowych umożliwia wykonywanie 32 lub 64 równoległych operacji logicznych jako jednej operacji na liczbach całkowitych, co jest bardzo szybkie.
Nie można przypadkowo użyć '|' jako operatora bitowego; oba operandy musiałyby być albo boolean albo integral. A w warunkowym wyrażeniu jesteś ograniczony do wartości logicznej. – cHao
@CHao Yep, poprawne. Usunięto go tuż przed tym, jak zobaczyłem twój komentarz, ponieważ nie było to tak naprawdę związane z faktycznym pytaniem. – kin3tik
możliwy duplikat [Przyczyna zaistnienia operatorów logicznych niezwiązanych z zwarciem] (http://stackoverflow.com/questions/9264897/reason-for-the-exsistance-of-non-short-circuit-logical-operators) – fredoverflow