Довольно часто в коде ANSI C я вижу круглые скобки вокруг одного возвращаемого значения.
Нравится:-
int foo(int x) {
if (x)
return (-1);
else
return (0);
}
Зачем в таких случаях использовать () вокруг возвращаемого значения? Есть идеи? Я не вижу причин для этого.
Но return - это не вызов функции, если вы не программист. :-П
Туони: Я хочу знать, почему люди ставят ненужные скобки и для sizeof!
Хотя для этой привычки часто предлагаются апостериорные эргономические обоснования, стоит взглянуть на современные языки, в которых есть операторы возврата, и спросить, существует ли такое же соглашение. AFAIK ответ - громкое НЕТ. Ответ User10392 интересен тем, что он дает специфическое для C преимущество, вытекающее из привычки.
Возможный дубликат Имеют ли значение круглые скобки вокруг результата в операторе возврата?





Как это часто бывает при использовании круглых скобок, я думаю, это просто для удобства чтения (например, Ruby поддерживает вызовы методов без скобок, заключающих аргументы, но в последних книгах и статьях говорится об обратном).
На самом деле нет причины ... это просто старая конвенция.
Чтобы сэкономить место, программисты часто выполняют окончательные вычисления в строке возврата, а не в ее собственной строке, и скобки гарантируют, что они в основном присутствуют, чтобы было легче увидеть, что это единственный оператор, который возвращается, например:
return (x+i*2);
вместо
int y = x+i*2;
return y;
Скобка вошла в привычку и прижилась.
Я делаю это, когда возвращаюсь к математике вот так. Я не знаю, это похоже на то, что я боюсь, что метод вернется до того, как математика завершит оценку или что-то еще.
Рад, что не только я считал это ненужным. ;-) Круглые скобки для установки приоритета понятны, но ИМХО, оператор возврата, подобный приведенному выше, должен быть разделен на несколько операторов. Повышает удобочитаемость и снижает вероятность ошибок. Не бойтесь отказаться от обозначения колбасы! ;-)
Чтобы сэкономить место? Пожалуйста, объясни. Неужто return x+i*2; короче?
@TonyK - Вау ... Я признаю, что это было сформулировано нечетко или грамматически неправильно. Я имел в виду, что вместо двух строк ... Я отредактировал свой ответ, см. Выше.
«паренсы гарантируют, что в основном это делается для того, чтобы было легче увидеть, что это единственный оператор, который возвращается» - что это вообще должно означать? кроме грамматики, вы не можете возвращать операторы, и он использует больше места, чем без скобок.
Извините, что возродил такой старый ответ, но на самом деле есть причина является. В самые ранние дни C, до того, как он был стандартизирован, скобки требовались синтаксисом. См. cm.bell-labs.com/cm/cs/who/dmr/cman.ps.
@MarcLehmann: Я понятия не имею, что это должно означать, и как он получил такое большое количество голосов и был принят. Добавление круглых скобок мне кажется некрасивым (я бы даже избавился от них для if и др., Если бы я был королем). Что касается make it easier to see that it is a single statement that is returned, во-первых, это выражение, а не «утверждение» - и что - люди думают, что return является жадным оператором и что return x+i*2 может вернуть x и отбросить все остальное? Если да, то ничего себе. Или этот ответ действительно думал о длинных выражениях, которые могут занимать несколько строк? В любом случае, он полностью упустил свой смысл.
Мой личный стиль - использовать круглые скобки, если есть сложное выражение; например.,
return (a + b);
но не использовать их, если выражение - простой термин
return a;
Я не могу сказать, почему я так делаю; просто то, что я давно подобрал.
Кстати, я думаю, что это выглядит как вызов функции, например:
return(a); // ugh
невероятно некрасиво и просто неправильно.
И субъективно - я думаю, что пространство выглядит хуже (что в равной степени, но противоположно субъективно).
И есть return (a); и return a ;
Причин несколько:
если / пока / для / и т. д. все контрольные ключевые слова, которые должны иметь скобки. Поэтому часто кажется естественным всегда класть их и по возвращении.
sizeof - единственное другое ключевое слово, которое может иметь их или нет, за исключением того, что в некоторых случаях должен использует скобки. Так легче привыкнуть всегда использовать парные скобки. для sizeof, что подразумевает логику: если можешь, всегда делай.
case / goto - единственные ключевые слова, в которых вы никогда не используете скобки. ... и люди склонны рассматривать их как особые случаи (и любят, чтобы они оба выделялись среди других управляющих ключевых слов, особенно goto).
Практический, но маловероятный мотив состоит в том, что если вы заключите значение в круглые скобки, вы можете определить return как макрос, а затем вставить некоторый код регистрации для просмотра всех ваших возвратов.
Ух ты! Маловероятно, что это может быть, но это единственный мотив, который я когда-либо слышал, предложенный для привычки, которая не сводится к «о, ну, кто-то, вероятно, думал, что это может выглядеть лучше или быть более последовательным», ни один из которых никогда не казался даже отдаленно убедительно для меня. Спасибо за это здравомыслие !!
Интересное наблюдение. В своих экспериментах я заметил, что макрос, определенный для возвращаться, по-видимому, разрешает аргументы макроса без скобок, но макрос, определенный для другого имени (скажем, квадрат), нет. Кажется, на этот раз я смотрел в бездну ...
... лучше надеяться, что никто не вызовет функцию, не использует оператор приращения или не имеет каких-либо других побочных эффектов в своих операторах возврата.
Это веский аргумент не использовать круглые скобки для операторов возврата.
@CarlNorum, не могли бы вы привести простой пример?
@polynomial_donut - если у вас есть выражение в операторе возврата, могут возникнуть обычные проблемы, связанные с макросами, такие как множественное вычисление.
Я работал по крайней мере с одним программистом, который думал, что return был является каким-то особым видом вызова функции, и был удивлен, когда увидел, что мой код соответствует требованиям без скобок.
А раньше в некоторых контекстах это реализовывалось довольно своеобразной функцией cret на уровне ассемблера. Итак, это широкое заявление; Я должен найти ссылку. Это было в книге Комера XINU - вы можете найти это через поиск Google в Purdue University.
При возврате -1, как в вашем примере, я думаю, что это более читается с круглыми скобками, потому что минус более заметен:
return 1
или же
return -1
или же
return (-1)
Использование круглых скобок в операторе return свидетельствует о недостаточном понимании синтаксиса C/C++. Это так просто. Но это не так плохо, как заключить все в фигурные скобки:
int foo(int x) {
if (x) {
return (-1);
}
else {
return (0);
}
}
Так много программистов делают это. Если кто-то из вас это прочитает, возможно, вы захотите объяснить.
Обычно фигурные скобки используются для уменьшения вероятности внесения ошибок в будущие правки кода. Первый ответ на этот вопрос дает пример: programmers.stackexchange.com/questions/16528/…
Кроме того, постоянное использование фигурных скобок делает код более удобным для автоматического слияния. В противном случае у вас гораздо больше шансов получить конфликты, которые придется обрабатывать вручную.
Существует бесчисленное количество случаев ошибок, возникающих из-за отсутствия фигурных скобок. Я согласен, что они уродливы для одной строки, но когда вы заменяете вызов функции макросом - как это иногда случается из-за особых ограничений - или когда программа подвергается рефакторингу для замены однострочного выражения более длинным набором выражений, ошибки могут не быть быть очевидным и происходить только в тех особых случаях, которые не поддаются автоматическому тестированию. Фигурные скобки также являются жестко запрограммированным требованием в некоторых компаниях (у меня это было в военной подрядной компании) даже для 1 вкладыша.
MISRA категорически запрещает снимать эти «лишние» скобки.
Возможно, это обычай - в конце концов, люди, которые принесли нам Unix и C, пришли из проекта Multics. Multics написан на PL / I, а в PL / I круглые скобки обязательны.
Круглые скобки в операторе возврата указывают компилятору, что вы хотите, чтобы это значение возвращалось в стеке, а не в памяти.
Раньше это строго соблюдалось (обычно), но сегодня большинство компиляторов воспринимают это только как подсказку.
Я делаю это часто, поскольку ошибка может повредить что-либо, возвращаемое через ссылку на память, но обычно не влияет на переменную, возвращаемую в стек.
Использование стека для временных переменных также сокращает использование памяти и, как правило, ускоряет вызов / возврат функции, потому что именно для этого предназначен стек, временные данные / переменные.
Если действительно существует компилятор, который это делает, было бы здорово показать пример сборки, сгенерированной компилятором для каждого случая.
В исходной спецификации C возвращаемое значение заключалось в круглые скобки. Хотя современные компиляторы C и стандарт ANSI C не требуют их, наличие круглых скобок не влияет на возвращаемое значение, и программисты иногда по-прежнему включают их по привычке из-за незнания стандартов для согласованности со стилистическим соглашением, которое их требует. , или, возможно, для обратной совместимости.
Я должен добавить, для людей, которые думают о C++: вопрос Этот касается C, а C - это не C++; это два разных языка с разными стандартами, возможностями, уровнями сложности и разными стилями использования, которые возникают - что бы у них ни было общего, разумно рассматривать их как две совершенно разные вещи. По аналогичному вопросу, касающемуся C++, см. Имеют ли значение круглые скобки вокруг результата в операторе возврата?.
ИМХО, это единственный разумный / убедительный ответ (поскольку он объясняет, откуда взялась странная привычка). Я приехал сюда из SO: Имеют ли значение круглые скобки вокруг результата в операторе возврата?, просто узнав еще одно существенное различие между C и C++ ...
Это похоже на вызов функции ;-).