Скобки вокруг возвращаемых значений - PullRequest
67 голосов
/ 02 октября 2008

Довольно часто в коде ANSI C я вижу круглые скобки, окружающие одно возвращаемое значение.

Как это: -

int foo(int x) {
  if (x)
    return (-1);
  else
    return (0);
}

Зачем использовать () вокруг возвращаемого значения в этих случаях? Есть идеи? Я не вижу причин для этого.

Ответы [ 11 ]

56 голосов
/ 02 октября 2008

На самом деле нет причины ... это просто старое соглашение.

Чтобы сэкономить место, программисты часто делали последнюю математику в строке возврата, а не в своей собственной строке, а парены гарантировали, что в основном они находятся там, чтобы было легче увидеть, что это единственный оператор, который возвращается, например, так:

return (x+i*2);

вместо

int y = x+i*2;
return y;

Скобки стали привычкой и застряли.

47 голосов
/ 02 октября 2008

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

23 голосов
/ 02 октября 2008

Мой личный стиль - использовать круглые скобки, если есть сложное выражение; например.,

return (a + b);

но не использовать их, если выражение является простым термином

return a;

Я не могу сказать, почему я так делаю; просто то, что я подобрал давным-давно.

Кстати, я думаю, что это выглядит как вызов функции, например:

return(a);  // ugh

невероятно безобразен и просто неправ.

14 голосов
/ 21 октября 2017

В исходной спецификации C круглые скобки требовались вокруг возвращаемого значения. Хотя современные компиляторы C и стандарт ANSI C не требуют их, наличие круглых скобок не влияет на возвращаемое значение, и программисты иногда все еще включают их по привычке, незнанию стандартов, для соответствия стилистическому соглашению, которое требует их, или, возможно, для обратной совместимости.

Я должен добавить, для людей, которые думают о C ++: Этот вопрос касается C, а C не C ++; это два разных языка с разными стандартами, возможностями, уровнями сложности и разными стилями использования, которые появляются - что бы у них ни было общего, разумно рассматривать их как две совершенно разные вещи. По аналогичному вопросу, касающемуся C ++, см. Значат ли круглые скобки вокруг результата в выражении return? .

13 голосов
/ 02 октября 2008

Есть несколько причин:

  1. , если / пока / для / и т.д.. все контрольные ключевые слова, которые должны иметь парены. Поэтому часто кажется естественным всегда возвращать их обратно.

  2. sizeof - это единственное другое ключевое слово, которое может иметь их или нет, за исключением того, что в некоторых случаях вы должны использовать парены. Так что легче привыкнуть к использованию паренов. для sizeof, что подразумевает логику: если можете, всегда делайте.

  3. case / goto - единственные ключевые слова, в которых вы никогда не используете парены. ... и люди склонны думать о них как об особых случаях (и им нравится выделяться на фоне других контрольных ключевых слов, особенно goto).

8 голосов
/ 08 октября 2008

При возврате -1, как в вашем примере, я думаю, что это лучше читается с круглыми скобками, потому что минус более заметен:

return 1

или

return -1

или

return (-1)
4 голосов
/ 25 апреля 2014

Возможно, это обычай - в конце концов, люди, которые принесли нам Unix и C, пришли из проекта Multics. Multics был написан на PL / I, а в PL / I скобки обязательны.

2 голосов
/ 03 октября 2008

Я работал по крайней мере с одним программистом, который думал, что return был каким-то особым вызовом функции, и был удивлен, когда увидел, что мой код соответствует без символов.

2 голосов
/ 02 октября 2008

Как часто бывает в случае использования скобок, я думаю, что это просто для удобства чтения (например, Ruby поддерживает вызовы методов без скобок, содержащих аргументы, но последние книги и статьи рекомендуют иначе).

0 голосов
/ 26 марта 2016

Скобки в операторе возврата указывают компилятору, что вы намерены вернуть это значение в стек, а не в память.

В старые времена это строго соблюдалось (как правило), но сегодня большинство компиляторов воспринимают это только как подсказку.

Это то, что я делаю часто, поскольку ошибка может повредить все, что возвращается через ссылку на память, но обычно не влияет на переменную, возвращаемую в стеке.

Использование стека для переходных переменных также сокращает использование памяти и, как правило, ускоряет вызов / возврат функции, потому что для этого предназначен стек, переходные данные / переменные.

...