Скобки, окружающие возвращаемые значения
Довольно часто в коде 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);
}
}
Так много программистов делают это. Если кто-то из вас читает это, возможно, вам захочется объяснить.