Скобки вокруг результата значительны в заявлении о возврате?
Есть ли разница между этими двумя утверждениями внутри функции?
bool returnValue = true; //Code that does something return(returnValue);
и это?
bool returnValue = true; //Code return returnValue;
Первый имеет круглые скобки вокруг returnValue
.
- C # отправить простую команду SSH
- Быстрая и компактная сериализация объектов в .NET.
- Объединение переменных имен в C?
- JIT компилятор против автономных компиляторов
- Список readonly с частным набором
- Почему преобразование из строковой константы в 'char *' допустимо в C, но недействительно в C ++
- Псевдонимы T * с char * разрешены. Разрешено ли это другим способом?
- Каковы потенциальные опасности при использовании boost :: shared_ptr?
- C ++ и Boost: кодирование / декодирование UTF-8
- Сериализовать словарь .NET в JSON Key Value Pair Object
- Показать QImage с QtGui
- Приведение float в int (побитовое) в C
- Почему эта программа ошибочно отвергается тремя компиляторами C ++?
В C ++ 14 добавлен случай, когда круглые скобки вокруг возвращаемого значения могут изменять семантику. Этот fragment кода показывает две объявляемые функции. Единственное различие – скобки вокруг возвращаемого значения.
int var1 = 42; decltype(auto) func1() { return var1; } // return type is int, same as decltype(var1) decltype(auto) func1() { return(var1); } // return type is int&, same as decltype((var1))
В первом func1
возвращает int
а во втором func1
возвращает int&
. Разница в семантике напрямую связана с окружающими круглыми скобками .
auto
спецификатор в его последней форме был введен в C ++ 11. В языке языка C ++ он описывается как:
Указывает, что тип объявляемой переменной будет автоматически выведен из его инициализатора. Для функций указывает, что возвращаемый тип является возвращаемым типом возврата или будет выведен из его операторов возврата (начиная с C ++ 14)
Кроме того, C ++ 11 представил спецификатор decltype
который описан в спецификации языка C ++ :
Проверяет объявленный тип объекта или запрашивает возвращаемый тип выражения.
[Надрез]
Если аргумент является либо нерасширенным именем объекта / функции, либо является выражением доступа к члену (member.member или pointer->), тогда decltype указывает объявленный тип объекта, указанного этим выражением.
Если аргументом является любое другое выражение типа T, то
a) если категория значений выражения равна xvalue, то в определении decltype указывается T &&
b) если категория значений выражения равна lvalue, то в определении decltype указывается T &
c) в противном случае decltype указывает T
[Надрез]
Обратите внимание: если имя объекта заключено в скобки, оно становится выражением lvalue, поэтому decltype (arg) и decltype ((arg)) часто являются разными типами.
В C ++ 14 была разрешена возможность использования decltype(auto)
для типов возвращаемых функций. Исходные примеры – это то, где вступает в действие семантическая разница с круглыми скобками. Пересмотр исходных примеров:
int var1 = 42; decltype(auto) func1() { return var1; } // return type is int, same as decltype(var1) decltype(auto) func1() { return(var1); } // return type is int&, same as decltype((var1))
decltype(auto)
позволяет возвращать возвращаемый тип возвращаемой функции из выражения entity / expression в операторе return. В первой версии return var1;
фактически совпадает с возвратом типа decltype(var1)
(тип возврата int
по правилу 1 выше), а во втором случае return (var1);
он фактически совпадает с decltype((var1))
(тип int &
return по правилу 2b).
Скобки создают тип возвращаемого значения int&
вместо int
, что приводит к изменению семантики. Мораль истории – «Не все круглые скобки по типу возврата создаются равными»
Да, один возвращает bool
, в то время как другой boo
…
После редактирования:
нет, они одинаковы.
Нет никакой разницы.
Одной из причин использования скобок было бы, если бы вы хотели оценить выражение перед возвратом, но в вашем примере не было бы никакой причины. Видеть:
Скобки, окружающие возвращаемые значения
для дальнейшего обсуждения.
AFAIK, ничего не изменилось.
В C ++ выражения могут иметь форму: expr
или (expr)
. Таким образом, последнее является выражением с более типизированным. Для дальнейшего ознакомления с этим, обратитесь к грамматике (найдите «выражение»).
Скобки в верхнем примере являются излишними; они фактически игнорируются.
Это было бы так же, как что-то вроде …
int x = (5);
Здесь также игнорируются круглые скобки.
Нет, в вашем коде нет разницы.
Я предполагаю, что boo
– опечатка, и вы спрашиваете, есть ли разница между
return expr;
а также
return(expr);
Ответ – нет.
Нет, между ними нет никакой разницы, хотя вы можете включить скобки, если это облегчает чтение и очистку выражения.
Вы оскорбительно тормозите компилятор!
Наличие скобок не только замедляет фазу предварительной обработки, но и генерирует более сложное абстрактное дерево синтаксиса: больше памяти, больше вычислений.
С семантической точки зрения? Они точно идентичны. Будут ли скобки или нет, оператор return
будет полностью оценивать выражение перед его возвратом.
Они идентичны. Я вижу синтаксис скобок довольно часто, и я всегда спрашиваю тех, кто его использует: почему ? И никто не может ответить, почему они его используют.
Чтобы прямо подвести итог, скобки вокруг возвращаемых выражений используются людьми, которые не совсем понимают разницу между функционально подобными макросами и функциями или смущены в отношении приоритета или порядка оценки правил в C. Отсутствует кодирование стиль выгоды от использования круглых скобок.
таким образом
return value;
правильнее, чем
return (value)
потому что последнее предполагает, что вы не совсем знаете, что делаете 🙂
Нет разницы!!
Люди используют скобки, если есть сложное выражение.
BTW return
– это утверждение, а не функция.
Оба одинаковы в вашем случае.