Каково намерение помещать возвращаемые значения в круглые скобки в C/Objective-C?

Я столкнулся с некоторым кодом, который окружает возвращаемое значение из метода/функции в круглых скобках.

Что это делает?

Код, который я видел, взял изображение, изменил его размер, а затем вернул.

- (UIImage *)resizeImage:(UIImage *)image
{
    //
    // some fascinating, but irrelevant, resizing code here
    //

    return (image);
}

person Jasarien    schedule 11.10.2010    source источник
comment
Людям нравится делать return похожим на вызов функции? Руководство по стилю Google говорит, что им стыдно: google-styleguide.googlecode.com/ SVN/багажник/   -  person Nick T    schedule 11.10.2010
comment
@Nick T: Однажды я встретил парня, который думал, что return был функцией…   -  person Steve M    schedule 11.10.2010
comment
@Nick T: Пара проблем с этим советом. 1) Это руководство по стилю C++. @) Если вы не работаете в Google, возможно, вы получили плохой общий совет (хорошо для кода Google, плохо для общего C++).   -  person Martin York    schedule 12.10.2010
comment
@Martin York: Я использую его для C. Да, я понимаю, что это для C++, но между двумя языками (и, предположительно, Obj-C) есть некоторое совпадение, и неплохо иметь какое-то руководство по стилю. У меня есть мозг, и я отклоняюсь, когда у меня есть причина, но я не понимаю, как вы могли бы иметь его для этого случая (в скобках выражения возврата).   -  person Nick T    schedule 12.10.2010
comment
@Nick T: я не понимаю, почему это должно быть в руководстве по стилю. Это не вредит, не затрудняет чтение (при разумном использовании может даже облегчить чтение). Но хорошо известно, что руководство по стилю Google разработано для внутреннего использования Google, где у них есть особые требования из-за устаревшей кодовой базы. Применение этого к современному C++ не считается хорошей идеей (по крайней мере, на мой взгляд), а использование его в качестве ссылки для предоставления совета без контекста - просто плохой совет.   -  person Martin York    schedule 12.10.2010
comment
@Martin York: 1) Я даже не давал никаких советов, я просто объяснял, почему люди могут это делать. 2) Контекст (согласно вопросу): помещение возвращаемых значений в круглые скобки. 3) Если новый стандарт в мире C++ состоит в том, чтобы бессмысленно заключать все в скобки, то я думаю, это здорово. Наверное, поэтому я так ненавижу C++.   -  person Nick T    schedule 12.10.2010


Ответы (4)


По крайней мере, что касается C, это не имеет значения. Скобки необязательны, но они не меняют смысла оператора return. Грамматика оператора return

return-statement:
    return expressionopt ;

и одним из результатов нетерминального выражения является выражение-в-круглых скобках или ( выражение ).

person John Bode    schedule 11.10.2010

Ничего такого. Это совершенно бесполезно.

Он переопределяет приоритет оператора, но ни один оператор не будет иметь более низкий приоритет, чем «возврат».

person Tomas    schedule 11.10.2010
comment
Вы имеете в виду, что ни один оператор не будет иметь приоритет ниже, чем return. Это не оператор... - person Steve Jessop; 11.10.2010

Короткий ответ заключается в том, что это просто выбор стиля, например использование «/* комментариев */» вместо «//комментариев».

person Sam Skuce    schedule 11.10.2010
comment
Комментарии // на самом деле не являются выбором стиля, потому что они разрешены, начиная с C99. Если вы программируете по старому стандарту, вам лучше не использовать их, если вы хотите написать соответствующий код. - person Secure; 11.10.2010
comment
Я думаю, что компилятор, который я использую, даже не жалуется, когда вы компилируете // комментарии с установленным строгим флагом ANSI (по умолчанию C89, C99 на самом деле не поддерживается) - person Nick T; 12.10.2010
comment
@Nick: Часто флаг семантики ANSI отделен от флага всех предупреждений. - person Potatoswatter; 12.10.2010

В вашем случае это эквивалентно вводу return без круглых скобок. Как правило, вы должны использовать круглые скобки для приведения типов или если хотите рассматривать выражение как независимый блок.

Например:

// This is an untyped pointer to an instance of SomeClass
void* ptr = instance;

// In order to let the compiler know that ptr is an instance of SomeClass
// we cast it, and then we put the cast in parentheses to be able to access
// a property on the result of the cast.
return ((SomeClass *)ptr).someproperty;
person Splashdust    schedule 11.10.2010
comment
Разве вам не нужно -> вместо .? А ; в конце? - person Arun; 11.10.2010
comment
x->y является синонимом (*x).y, поэтому вы будете дважды разыменовывать. Я не уверен, как кастинг будет работать с доступом к участникам, но ((SomeClass)ptr)->someproperty может сработать. - person Nick T; 12.10.2010
comment
В Obj-C вы можете использовать точечный синтаксис при доступе к свойствам. Итак, [code]((SomeClass *)ptr).someproperty;[/code] эквивалентно [code][(SomeClass *)ptr someproperty];[/code] И да, я забыл точку с запятой :) - person Splashdust; 12.10.2010