Круглые скобки вокруг возвращаемых значений в C

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

Нравится:-

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

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


person Tooony    schedule 02.10.2008    source источник
comment
Так похоже на вызов функции ;-).   -  person Toon Krijthe    schedule 02.10.2008
comment
Но return - это не вызов функции, если вы не программист. :-П   -  person Chris Jester-Young    schedule 02.10.2008
comment
Туони: Я хочу знать, почему люди ставят ненужные скобки и для sizeof!   -  person Chris Jester-Young    schedule 02.10.2008
comment
Хотя для этой привычки часто предлагаются апостериорные эргономические обоснования, стоит взглянуть на современные языки, в которых есть операторы возврата, и спросить, существует ли такое же соглашение. AFAIK ответ - громкое НЕТ. Ответ User10392 интересен тем, что он дает специфическое для C преимущество, вытекающее из привычки.   -  person AmigoNico    schedule 19.06.2013
comment


Ответы (11)


На самом деле нет причины ... это просто старая конвенция.

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

return (x+i*2);

вместо

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

Скобка вошла в привычку и прижилась.

person Adam Haile    schedule 02.10.2008
comment
Я делаю это, когда возвращаюсь к математике вот так. Я не знаю, это похоже на то, что я боюсь, что метод вернется до того, как математика завершит оценку или что-то еще. - person Wes P; 02.10.2008
comment
Рад, что не только я считал это ненужным. ;-) Круглые скобки для установки приоритета понятны, но ИМХО, оператор return, подобный приведенному выше, должен быть разделен на несколько операторов. Повышает удобочитаемость и снижает вероятность ошибок. Не бойтесь отказаться от обозначения колбасы! ;-) - person Tooony; 02.10.2008
comment
Чтобы сэкономить место? Пожалуйста, объясни. Неужто return x+i*2; короче? - person TonyK; 21.01.2011
comment
@TonyK - Вау ... Я признаю, что это было сформулировано нечетко или грамматически неправильно. Я имел в виду, что вместо двух строк ... Я отредактировал свой ответ, см. Выше. - person Adam Haile; 21.01.2011
comment
паренсы гарантируют, что они в основном присутствуют, чтобы было легче увидеть, что это единственный оператор, который возвращается - что это вообще должно означать? кроме грамматики, вы не можете возвращать операторы, и он использует больше места, чем без парных скобок. - person Remember Monica; 17.10.2014
comment
Извините, что возродил такой старый ответ, но на самом деле есть причина. В самые ранние дни C, до того, как он был стандартизирован, скобки требовались синтаксисом. См. cm.bell-labs.com/cm/cs/ who / dmr / cman.ps. - person Segmented; 28.03.2015
comment
@MarcLehmann: Я понятия не имею, что это должно означать, и почему он получил такое большое количество голосов и признание. Добавление круглых скобок мне кажется некрасивым (если бы я был королем, я бы даже избавился от них для if и др.). Что касается make it easier to see that it is a single statement that is returned, во-первых, это выражение, а не утверждение - и что - люди думают, что return является жадным оператором и что return x+i*2 может вернуть x и отбросить все остальное? Если так, то ничего себе. Или этот ответ действительно думал о длинных выражениях, которые могут занимать несколько строк? В любом случае, он полностью упустил свой смысл. - person underscore_d; 31.07.2016

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

person user10392    schedule 02.10.2008
comment
Вау! Маловероятно, что это может быть, но это единственный мотив, который я когда-либо слышал, предложенный для привычки, которая не сводится к ну, ну, кто-то, вероятно, подумал, что это может выглядеть лучше или быть более последовательным, ни один из которых никогда не казался даже отдаленно убедительным. меня. Спасибо за это здравомыслие !! - person AmigoNico; 19.06.2013
comment
Интересное наблюдение. В своих экспериментах я заметил, что макрос, определенный для return, по-видимому, разрешает аргументы макроса без скобок, а макрос, определенный для другого имени (скажем, квадрат), - нет. Кажется, на этот раз я смотрел в бездну ... - person Alain O'Dea; 29.08.2015
comment
... лучше надеяться, что никто не вызовет функцию, не использует оператор приращения или не имеет каких-либо других побочных эффектов в своих операторах возврата. - person Carl Norum; 29.09.2016
comment
Это веский аргумент не использовать круглые скобки для операторов возврата. - person nowox; 07.12.2017
comment
@CarlNorum, не могли бы вы привести простой пример? - person polynomial_donut; 19.09.2018
comment
@polynomial_donut - если у вас есть выражение в операторе возврата, могут возникнуть обычные проблемы, связанные с макросами, такие как множественное вычисление. - person Carl Norum; 19.09.2018

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

return (a + b);

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

return a;

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

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

return(a);  // ugh

невероятно некрасиво и просто неправильно.

person Kristopher Johnson    schedule 02.10.2008
comment
И субъективно - я думаю, что пространство выглядит хуже (что в равной степени, но противоположно субъективно). - person Jonathan Leffler; 03.10.2008
comment
И там return (a); и return a ; - person ; 02.03.2014

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

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

person rakslice    schedule 21.10.2017
comment
ИМХО, это единственный разумный / убедительный ответ (поскольку он объясняет, откуда взялась странная привычка). Я пришел сюда из SO: значимы ли скобки вокруг результата в операторе возврата?, просто узнав еще одно существенное различие между C и C ++ ... - person Scheff's Cat; 24.04.2019

Причин несколько:

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

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

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

person James Antill    schedule 02.10.2008

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

return 1

or

return -1

or

return (-1)
person Stein G. Strindhaug    schedule 08.10.2008

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

person James Jones    schedule 25.04.2014

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

person AShelly    schedule 02.10.2008
comment
А раньше в некоторых контекстах это реализовывалось довольно своеобразной функцией cret на уровне ассемблера. Итак, это широкое заявление; Я должен найти ссылку. Это было в книге Комера XINU - вы можете найти это через поиск Google в Purdue University. - person Jonathan Leffler; 03.10.2008

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

person Manrico Corazzi    schedule 02.10.2008

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

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

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

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

person Diogenes    schedule 26.03.2016
comment
Если действительно есть компилятор, который это делает, было бы здорово показать пример сборки, сгенерированной компилятором для каждого случая. - person rakslice; 29.06.2018

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

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

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

person TonyK    schedule 21.01.2011
comment
Обычно фигурные скобки используются для уменьшения вероятности внесения ошибок в будущие правки кода. В первом ответе на этот вопрос приводится пример: programmers.stackexchange.com/questions/16528/ - person Mike Pelley; 25.08.2011
comment
Кроме того, постоянное использование фигурных скобок делает код более удобным для автоматического слияния. В противном случае у вас гораздо больше шансов получить конфликты, которые придется обрабатывать вручную. - person hlovdal; 14.12.2012
comment
Существует бесчисленное количество случаев ошибок, возникающих из-за отсутствия фигурных скобок. Я согласен, что они уродливы для одной строки, но когда вы заменяете вызов функции макросом - как это иногда случается из-за особых ограничений - или когда программа подвергается рефакторингу для замены однострочного выражения более длинным набором выражений, ошибки могут не быть быть очевидным и происходить только в тех особых случаях, которые не поддаются автоматическому тестированию. Фигурные скобки также являются жестко запрограммированным требованием в некоторых компаниях (у меня это было в военной подрядной компании) даже для 1 вкладыша. - person Coyote; 10.05.2013
comment
MISRA категорически запрещает снимать эти лишние скобки. - person Toby; 08.07.2015