В конце концов, return «происходит после»?

Для C++, я предлагаю Ускоренный C++ Koenig и Мычанием как начинающийся текст, хотя я не знаю, как это было бы для абсолютного новичка. Это фокусируется на использовании STL сразу же, который делает добивающимся цели очень легче.

29
задан Community 23 May 2017 в 10:29
поделиться

4 ответа

@ Дэвид Хеффернан имеет правильный ответ. Спецификация JLS говорит о поведении оператора return (включая то, как он взаимодействует с блоками finally) в разделе 14.17. Копирование оттуда (выделено мной):

Оператор return с выражением пытается передать управление вызывающему методу, который его содержит; значение Expression становится значением вызова метода. Точнее, выполнение такого оператора возврата сначала оценивает выражение . Если по какой-либо причине оценка Expression завершается преждевременно, то по этой причине оператор return завершается преждевременно. Если вычисление Expression завершается нормально, производя значение V, тогда оператор return завершается преждевременно, причиной чего является возвращение со значением V. Если выражение имеет тип float и не строго FP (§15.4), тогда значение может быть элементом либо набора значений с плавающей запятой, либо набора значений с расширенной экспонентой с плавающей запятой (§4.2.3). Если выражение имеет тип double и не строго FP, тогда значение может быть элементом либо набора двойных значений, либо набора значений двойной расширенной экспоненты.

Таким образом, видно, что оператор return всегда завершается внезапно.

В предыдущих описаниях говорится «пытается передать управление», а не просто «передает управление», потому что если есть какие-либо операторы try (§14.20) внутри метода или конструктора, чьи блоки try содержат оператор return, то любой оператор finally предложения этих операторов try будут выполняться по порядку, от самого внутреннего к внешнему, до того, как управление будет передано вызывающему методу или конструктору . Внезапное завершение предложения finally может нарушить передачу управления, инициированную оператором return.

18
ответ дан 28 November 2019 в 01:46
поделиться

Вызов на queryDatabase() происходит первым. Затем, наконец, блок. Затем управление покидает функцию (это return).

20
ответ дан 28 November 2019 в 01:46
поделиться

Предложение finally должно выполняться независимо от того, каков результат или поведение блока try, поэтому finally выполняется до return.

3
ответ дан 28 November 2019 в 01:46
поделиться

Если вы используете только один поток, вы должны увидеть «take +, fetch +, fetch-, take-». В вашем примере он многопоточный, поэтому вы не уверены, что произойдет первым.

2
ответ дан 28 November 2019 в 01:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: