Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Вычисление выражений


Автор: Zloxa 14.2.2012, 11:10
Всем привет.
Не смог сходу придумать по какому критерию загуглить как вычисляются выражения, потому решил задать тупой вопрос.

Псевдокод:
Код

  if (func1() && func2()) {}

Вопросы
1) Могу ли я закладываться на то, что func2 будет всегда выполнится строго после func1?
2) Могу ли я закладываться на то, что func2 не выполнится всегда, если func1 не вернет истину?
3) Можно ли как нибудь принудить обе функции выполняться всегда?

Автор: Skynin 14.2.2012, 11:29
гуглите
Приоритеты операций и порядок вычислений Java

1. да.
2. да. правда завернули как-то не по людски.  лучше: ".... func2 никогда не выполнится, если func1 вернет ложь?"
3. да.

Автор: Pawl 14.2.2012, 11:36
Цитата(Zloxa @  14.2.2012,  11:10 Найти цитируемый пост)
3) Можно ли как нибудь принудить обе функции выполняться всегда?

Да, вот так:
Код

if (func1() & func2()) {}

Автор: Zloxa 14.2.2012, 11:59
Цитата(Skynin @  14.2.2012,  11:29 Найти цитируемый пост)
 правда завернули как-то не по людски.  лучше: ".... func2 никогда не выполнится, если func1 вернет ложь?"

Привык мыслить в  трехзначной логике.  smile 
Я понимаю, что один топик-один вопрос, но Жаве логический unknown не ведом вовсе?

Цитата(Skynin @  14.2.2012,  11:29 Найти цитируемый пост)
3. да.

Как?(третий вопрос)  smile 
Цитата(Skynin @  14.2.2012,  11:29 Найти цитируемый пост)
гуглите
Приоритеты операций и порядок вычислений Java

Так на официальную доку не выгуглишь ))
Подобрал мантру "Java expression evaluation order"
http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html
Цитата

The Java programming language guarantees that the operands of operators appear to be evaluated in a specific evaluation order, namely, from left to right.
It is recommended that code not rely crucially on this specification. Code is usually clearer when each expression contains at most one side effect, as its outermost operation, and when code does not depend on exactly which exception arises as a consequence of the left-to-right evaluation of expressions.

Т.е. как бы сначала дают гарантии, но потом отказываются от обязательств  smile 
Статус документа, вроде specification, т.е. закладываться на 1) как бы можно, но, в то же время, - не рекомендуется.

Какую бы мантру подобрать ко второму вопросу? smile

Добавлено @ 12:03
Цитата(Pawl @  14.2.2012,  11:36 Найти цитируемый пост)
Да, вот так:

В моем случае вопрос, наверное следовало бы поставить иначе - можно ли отключить Short-circuit evaluation. Мож там дирректива компилятору какая или еще ченить...

Автор: jk1 14.2.2012, 12:17
Цитата

В моем случае вопрос, наверное следовало бы поставить иначе - можно ли отключить Short-circuit evaluation. Мож там дирректива компилятору какая или еще ченить...


Нет. И я не очень понимаю зачем так делать. Если уж Ваш метод имеет side effect, который непременно нужен, то лучше бы разделить такой метод на два. Вам же потом понятнее читать будет.

Автор: Zloxa 14.2.2012, 13:02
Цитата(jk1 @  14.2.2012,  12:17 Найти цитируемый пост)
И я не очень понимаю зачем так делать.

Делать так не обязательно. Важно знать может ли это быть сделано. Третий вопрос, это как бы уточнение ко второму.

Автор: Skynin 14.2.2012, 18:57
Цитата

Какую бы мантру подобрать ко второму вопросу?

Давно говорю, в ВУЗах не тому учат.
Нужно учить гуглить!

Все равно книжек никто не читает.

http://en.wikipedia.org/wiki/Short-circuit_evaluation

Хотя на русском тоже начиная с справочника Шилдта об этом сказано
См. 
Глава 4 Операции
"Замыкающие логические операции"

Цитата

можно ли отключить Short-circuit evaluation. Мож там дирректива компилятору какая или еще ченить...

Нельзя, ибо редко нужно такое свойство. 

А дай в руки такое - поведение кода станет непредсказуемым. Нужно будет где-то смотреть "включено или выключено?"
И как уже указали, в Java легко "включить" полное вычисление операндов, используя & или | а не && или ||. 
Если очень хочется.



Автор: Zloxa 15.2.2012, 11:23
Цитата(Skynin @  14.2.2012,  18:57 Найти цитируемый пост)
en.wikipedia.org

Цитата(Skynin @  14.2.2012,  18:57 Найти цитируемый пост)
Шилдт

Skynin, не иронии ради, но лишь понимания положения дел для. Спецификация Java плохо описана производителем или же мало представлена в интернете, если за пруфами приходится обращаться к википедии или же технической публицистике, а не к официальной документации?

Цитата(Skynin @  14.2.2012,  18:57 Найти цитируемый пост)
Все равно книжек никто не читает.

К сожалению, мой опыт чтения книг говорит о том, что далеко не все современные книги следует читать. Многие откровенно вводят в заблуждение. Многие учат порочному, потому ссылке на книгу всегда предпочтительнее ссылка на официальную документацию. Хотя, конечно, да - название "Java 2 Programmer's Reference" и регалии автора, внушают определенное доверие, но, тем не менее это книга, а не документ, и издается она не от имени производителя платформы. По всему видать, я чересчур избалован документацией по oracle database. Редкая специфика в ней не освещена или же освещена не однозначно.

Автор: Dummy 15.2.2012, 12:22
Цитата(Zloxa @  15.2.2012,  11:23 Найти цитируемый пост)
Спецификация Java плохо описана производителем или же мало представлена в интернете

Ну зачем же так-то... Вот самая что ни на есть http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#5242 по вашему вопросу. Не скажу, что Java Language Specification - это самое увлекательное чтиво, но в отсутствии деталей её не упрекнёшь.

Автор: LSD 15.2.2012, 12:31
Цитата(Zloxa @  14.2.2012,  12:59 Найти цитируемый пост)
В моем случае вопрос, наверное следовало бы поставить иначе - можно ли отключить Short-circuit evaluation. Мож там дирректива компилятору какая или еще ченить...

Учитывая что конструкции типа:
Код

public void foo(Object[] objects) {
  if(objects != null && objects.length > 0) {

встречаются довольно часто, то можно грести немало лулзов отключив Short-circuit evaluation smile

Автор: Zloxa 15.2.2012, 12:54
Цитата(Dummy @  15.2.2012,  12:22 Найти цитируемый пост)
Вот

Спасибо!!!! То - что доктор прописал. smile 
Обидно, что я уже был на этой странце, когда разрешил свой первый вопрос. Использовал ctrl+f чтоб поискать на той же странице и ответ на второй, но, видать не правильные паттерны выбрал. smile

Цитата(LSD @  15.2.2012,  12:31 Найти цитируемый пост)
встречаются довольно часто

Таки не на всякие прецеденты можно опираться. Я и сам уже много раз подобную конструкцию испольовал, не будучи уверенным в ее правомочности. Вот теперь точки стоят на своих местах.

Цитата(Dummy @  15.2.2012,  12:22 Найти цитируемый пост)
Ну зачем же так-то... 

Я пытался выяснить мотивы, какими руководствуется участник предлагая в качестве пруфа такие странные для меня источники. 

Цитата(LSD @  15.2.2012,  12:31 Найти цитируемый пост)
немало лулзов

http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/devcommon/compdirsbooleanshortcircuitevaluation_xml.htmlтебе почвы для лулзов. Чисто 4 фан. Прошу как аргумент в гноблении делфистов не использовать(scope у этой директивы локальный, потому действует она лишь в рамках файла исходного кода, в котором она указана либо же до того фрагмента кода, где действие этой директивы отменяется).

Автор: LSD 15.2.2012, 14:25
Цитата(Zloxa @  15.2.2012,  13:54 Найти цитируемый пост)
добавлю тебе почвы для лулзов. Чисто 4 фан. Прошу как аргумент в гноблении делфистов не использовать(scope у этой директивы локальный, потому действует она лишь в рамках файла исходного кода, в котором она указана либо же до того фрагмента кода, где действие этой директивы отменяется).

Дельфи компилируется в нативный код, где уже не будет ни & ни &&. Однажды скомпилированная библиотека не будет уже менять свое поведение. А вот с байткодом могла бы быть совсем другая ситуация.

Хотя справедливости ради код
Код

if(objects != null && objects.length > 0)

компилируется в аналог:
Код

if(objects != null) {
  if(objects.length > 0) {
    ...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)