Скобки, окружающие возвращаемые значения

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

Вот так: -

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

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

Ответ 1

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

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

return (x+i*2);

вместо

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

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

Ответ 2

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

Ответ 3

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

return (a + b);

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

return a;

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

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

return(a);  // ugh

невероятно уродлив и просто ошибается.

Ответ 4

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

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

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

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

Ответ 5

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

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

Ответ 6

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

return 1

или

return -1

или

return (-1)

Ответ 7

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

Ответ 8

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

Ответ 9

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

Ответ 10

Возможно, это связано с тем, что в скобках он больше похож на вызов функции, т.е. больше похож на остальную часть кода?

Или это просто то, что все делают, только потому, что все это делают: -)

Ответ 11

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

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

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

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

Ответ 12

Использование круглых скобок в операторе return показывает недостаточное понимание синтаксиса C/C++. Это так просто. Но это не так плохо, как положить все в фигурные скобки:

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

Так много программистов делают это. Если кто-то из вас читает это, возможно, вам захочется объяснить.