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

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

Нравится:-

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

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

Это похоже на вызов функции ;-).

Toon Krijthe 02.10.2008 15:55

Но return - это не вызов функции, если вы не программист. :-П

Chris Jester-Young 02.10.2008 15:59

Туони: Я хочу знать, почему люди ставят ненужные скобки и для sizeof!

Chris Jester-Young 02.10.2008 15:59

Хотя для этой привычки часто предлагаются апостериорные эргономические обоснования, стоит взглянуть на современные языки, в которых есть операторы возврата, и спросить, существует ли такое же соглашение. AFAIK ответ - громкое НЕТ. Ответ User10392 интересен тем, что он дает специфическое для C преимущество, вытекающее из привычки.

AmigoNico 19.06.2013 06:33
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
76
5
26 073
11
Перейти к ответу Данный вопрос помечен как решенный

Ответы 11

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

Ответ принят как подходящий

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

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

return (x+i*2);

вместо

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

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

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

Wes P 02.10.2008 16:30

Рад, что не только я считал это ненужным. ;-) Круглые скобки для установки приоритета понятны, но ИМХО, оператор возврата, подобный приведенному выше, должен быть разделен на несколько операторов. Повышает удобочитаемость и снижает вероятность ошибок. Не бойтесь отказаться от обозначения колбасы! ;-)

Tooony 02.10.2008 18:03

Чтобы сэкономить место? Пожалуйста, объясни. Неужто return x+i*2; короче?

TonyK 21.01.2011 22:16

@TonyK - Вау ... Я признаю, что это было сформулировано нечетко или грамматически неправильно. Я имел в виду, что вместо двух строк ... Я отредактировал свой ответ, см. Выше.

Adam Haile 21.01.2011 22:47

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

Remember Monica 17.10.2014 15:31

Извините, что возродил такой старый ответ, но на самом деле есть причина является. В самые ранние дни C, до того, как он был стандартизирован, скобки требовались синтаксисом. См. cm.bell-labs.com/cm/cs/who/dmr/cman.ps.

Segmented 28.03.2015 02:22

@MarcLehmann: Я понятия не имею, что это должно означать, и как он получил такое большое количество голосов и был принят. Добавление круглых скобок мне кажется некрасивым (я бы даже избавился от них для if и др., Если бы я был королем). Что касается make it easier to see that it is a single statement that is returned, во-первых, это выражение, а не «утверждение» - и что - люди думают, что return является жадным оператором и что return x+i*2 может вернуть x и отбросить все остальное? Если да, то ничего себе. Или этот ответ действительно думал о длинных выражениях, которые могут занимать несколько строк? В любом случае, он полностью упустил свой смысл.

underscore_d 31.07.2016 02:36

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

return (a + b);

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

return a;

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

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

return(a);  // ugh

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

И субъективно - я думаю, что пространство выглядит хуже (что в равной степени, но противоположно субъективно).

Jonathan Leffler 03.10.2008 06:05

И есть return (a); и return a ;

user246672 02.03.2014 07:52

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

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

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

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

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

Ух ты! Маловероятно, что это может быть, но это единственный мотив, который я когда-либо слышал, предложенный для привычки, которая не сводится к «о, ну, кто-то, вероятно, думал, что это может выглядеть лучше или быть более последовательным», ни один из которых никогда не казался даже отдаленно убедительно для меня. Спасибо за это здравомыслие !!

AmigoNico 19.06.2013 06:18

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

Alain O'Dea 29.08.2015 18:20

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

Carl Norum 29.09.2016 21:18

Это веский аргумент не использовать круглые скобки для операторов возврата.

nowox 07.12.2017 13:54

@CarlNorum, не могли бы вы привести простой пример?

polynomial_donut 19.09.2018 00:28

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

Carl Norum 19.09.2018 20:45

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

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

Jonathan Leffler 03.10.2008 06:18

При возврате -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/…

Mike Pelley 25.08.2011 23:08

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

hlovdal 14.12.2012 10:27

Существует бесчисленное количество случаев ошибок, возникающих из-за отсутствия фигурных скобок. Я согласен, что они уродливы для одной строки, но когда вы заменяете вызов функции макросом - как это иногда случается из-за особых ограничений - или когда программа подвергается рефакторингу для замены однострочного выражения более длинным набором выражений, ошибки могут не быть быть очевидным и происходить только в тех особых случаях, которые не поддаются автоматическому тестированию. Фигурные скобки также являются жестко запрограммированным требованием в некоторых компаниях (у меня это было в военной подрядной компании) даже для 1 вкладыша.

Coyote 10.05.2013 17:48

MISRA категорически запрещает снимать эти «лишние» скобки.

Toby 08.07.2015 11:38

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

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

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

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

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

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

rakslice 29.06.2018 22:33

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

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

ИМХО, это единственный разумный / убедительный ответ (поскольку он объясняет, откуда взялась странная привычка). Я приехал сюда из SO: Имеют ли значение круглые скобки вокруг результата в операторе возврата?, просто узнав еще одно существенное различие между C и C++ ...

Scheff 24.04.2019 13:11

Другие вопросы по теме