Чи існує різниця між цими двома твердженнями всередині функції?
bool returnValue = true;
// Code that does something
return(returnValue);
і це?
bool returnValue = true;
// Code
return returnValue;
Перший має дужки навколо returnValue
.
Чи існує різниця між цими двома твердженнями всередині функції?
bool returnValue = true;
// Code that does something
return(returnValue);
і це?
bool returnValue = true;
// Code
return returnValue;
Перший має дужки навколо returnValue
.
c++
/ c
. Було б непогано визначитися з визначенням мови, але я не знаю, як це виправити через 9 років.
C
існує дублікат stackoverflow.com/questions/161879/…
Відповіді:
C ++ 14 додає регістр, де дужки навколо поверненого значення можуть змінити семантику. Цей фрагмент коду показує дві оголошені функції. Різниця лише в дужках навколо поверненого значення.
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
повертає a, int
а в другому - func1
an int&
. Різниця в семантиці безпосередньо пов’язана з оточуючими дужками .
Специфікатор auto
в останній формі був введений в C ++ 11. У мовній специфікації C ++ це описується як:
Вказує, що тип змінної, яка оголошується, буде автоматично виведений з її ініціалізатора. Для функцій вказує, що тип повернення є кінцевим типом повернення або буде виводитися з його операторів повернення (оскільки C ++ 14)
Окрім того, C ++ 11 представив decltype
специфікатор, який описаний в мовній специфікації C ++ :
Перевіряє оголошений тип сутності або запитує тип повернення виразу.
[сніп]
Якщо аргументом є або непрозоре ім'я об'єкта / функції, або вираз доступу до члена (object.member або pointer-> member), тоді decltype вказує оголошений тип сутності, вказаний цим виразом.
Якщо аргументом є будь-який інший вираз типу T, тоді
а) якщо категорією значень виразу є xvalue, тоді тип declt визначає T&&
б) якщо категорією значень виразу є lvalue, тоді тип declt визначає T &
в) інакше 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)
дозволяє завершуючий тип повернення у функції виводитись із сутності / виразу в операторі return. У першій версії return var1;
це фактично те саме, що повернення типу decltype(var1)
( тип int
повернення за правилом 1 вище), а у другому випадку return (var1);
це фактично те саме, що decltype((var1))
( int &
тип повернення за правилом 2b).
Дужки роблять тип повернення int&
замість int
, таким чином, змінюючи семантику. Мораль історії - "Не всі дужки типу повернення створені рівними"
return (x);
еквівалентно return &x;
, і не повинно бути можливим, щоб це призвело до повернення значення x, але з посиланням на тип x.
auto
. Чи наша семантика ніколи не змінюється, поки ми тримаємось подалі decltype
? Я боюся несподіваної поведінки, коли ми переходимо до наступної версії компілятора, яка включає наступну Visual Studio.
Різниці немає.
Однією з причин використання дужок було б, якщо ви хочете обчислити вираз перед поверненням, але у вашому прикладі причин не буде. Подивитися:
Дужки навколо повернутих значень
для подальшого обговорення.
return m * x + c
та return (m * x + c)
чи return ( (m * x) + c )
або, тощо - і це не виглядає ні кращим, ні інтуїтивнішим, якщо ви запитаєте мене.
Дужки у верхньому прикладі зайві; вони фактично ігноруються.
Це було б так само, як щось на зразок ...
int x = (5);
Дужки тут також ігноруються.
AFAIK, нічого не відрізняється.
У C ++ вирази можуть мати вигляд: expr
або (expr)
. Отже, останнє - вираз з більшою кількістю набору тексту. Для подальшого читання про це зверніться до граматики (шукайте "вираз").
Без різниці!!
Люди використовують дужки, якщо йдеться про складний вираз.
BTW return
- це твердження, а не функція.
Ні, між ними немає різниці, хоча ви можете включити дужки, якщо це робить вираз легким для читання та зрозумілістю.
return
про жадібного оператора, який return m * x + c
може повернутися m
і відкинути решту, чи що?
Ви грубо гальмуєте компілятор!
Наявність дужок не тільки уповільнює фазу попередньої обробки, але вони також генерують більш складне Дерево абстрактного синтаксису: більше пам'яті, більше обчислень.
З семантичної точки зору? Вони абсолютно ідентичні. Незалежно від того, є дужки чи ні, return
оператор повністю оцінить вираз перед його поверненням.
Вони однакові. Я бачу синтаксис дужок досить часто, і я завжди запитую тих, хто його використовує: чому ? І ніхто не може відповісти, чому вони цим користуються.
Щоб прямо підвести підсумок, дужки навколо виразів, що повертаються, використовуються людьми, які не зовсім розуміють різницю між функціональними макросами та функціями, або які заплутані щодо переваги оператора або порядку правил оцінки в C. Немає кодування вигода від використання дужок.
Таким чином
return value;
правильніше, ніж
return (value)
тому що останній припускає, що ви не зовсім знаєте, що робите :)
Обидва вони однакові у вашому випадку.
a
є 5
тоді return a++;
і return (a++);
(що однаково) обоє повернуться5