Являются ли скобки вокруг значения в C способом литья? [Дубликат]

$data = file_get_contents('php://input');
echo $data;

Это сработало для меня.

62
задан prakash 2 October 2008 в 13:02
поделиться

12 ответов

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

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

return (x+i*2);

вместо

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

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

54
ответ дан Adam Haile 20 August 2018 в 21:57
поделиться
  • 1
    Я склонен это делать, когда возвращаю математику. Я не знаю, это похоже на то, что я боюсь, что метод вернется, прежде чем математика будет оценена или что-то o.O – Wes P 2 October 2008 в 13:30
  • 2
    Рад, что не только я думал, что это не нужно. ;-) Скобки для установки приоритета понятны, но IMHO оператор возврата, как и выше, должен быть разделен на несколько операторов. Повышает читаемость и менее подвержен ошибкам. Осмелитесь сказать «нет» колбасной нотации! ;-) – Tooony 2 October 2008 в 15:03
  • 3
    Чтобы сэкономить место? Пожалуйста, объясни. Неужели return x+i*2; короче? – TonyK 21 January 2011 в 20:16
  • 4
    @TonyK - Вау ... Я признаю, что это не было сформулировано четко или грамматически правильно. Я имел в виду вместо двух строк ... Я отредактировал свой ответ, см. Выше. – Adam Haile 21 January 2011 в 20:47
  • 5
    «parens обеспечивают, в основном, там, чтобы было легче увидеть, что это единственный оператор, который возвращается». - что это даже должно означать? кроме грамматики, вы не можете возвращать утверждения, и он использует больше места, чем без парнеров. – Marc Lehmann 17 October 2014 в 12:31

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

2
ответ дан AShelly 20 August 2018 в 21:57
поделиться
  • 1
    И в старые времена, в некоторых контекстах, она была реализована довольно своеобразной функцией cret на уровне ассемблера. Теперь это радикальное заявление; Я должен найти ссылку. Это было в книге XINU Комера - вы можете найти это через поиск Google в Университете Пердью. – Jonathan Leffler 3 October 2008 в 03:18

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

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

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

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

-4
ответ дан Diogenes 20 August 2018 в 21:57
поделиться
  • 1
    Если действительно есть компилятор, который делает это, было бы здорово показать пример сборки, сгенерированной компилятором для каждого случая – rakslice 29 June 2018 в 19:33

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

  1. , если / while / для / etc. все контрольные ключевые слова, которые должны иметь parens. Поэтому часто кажется, что всегда всегда ставить их на возврат тоже.
  2. sizeof - единственное другое ключевое слово, которое может их иметь или нет, за исключением того, что в некоторых случаях вы должны использовать parens , Так что легче привыкнуть всегда использовать парсеры. для sizeof, что подразумевает логику: если вы можете, всегда делайте.
  3. case / goto - это единственные ключевые слова, в которых вы никогда не используете parens. ... и люди склонны думать о них как о специальных случаях (и как они оба выделяются из других контрольных ключевых слов, особенно).
13
ответ дан James Antill 20 August 2018 в 21:57
поделиться

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

3
ответ дан James Jones 20 August 2018 в 21:57
поделиться

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

return (a + b);

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

return a;

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

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

return(a);  // ugh

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

21
ответ дан Kristopher Johnson 20 August 2018 в 21:57
поделиться
  • 1
    И субъективный - я думаю, что пространство выглядит хуже (что одинаково, но противоположно субъективно). – Jonathan Leffler 3 October 2008 в 03:05
  • 2
    И есть return (a); и return a ; – Barry 2 March 2014 в 05:52

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

6
ответ дан rakslice 20 August 2018 в 21:57
поделиться

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

2
ответ дан RastaJedi 20 August 2018 в 21:57
поделиться

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

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

0
ответ дан Sec 20 August 2018 в 21:57
поделиться

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

return 1

или

return -1

или

return (-1)
8
ответ дан Stein G. Strindhaug 20 August 2018 в 21:57
поделиться

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

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

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

-6
ответ дан TonyK 20 August 2018 в 21:57
поделиться
  • 1
    Обычно скобки используются для уменьшения вероятности внесения ошибок в будущие изменения кода. Первый ответ на этот вопрос дает пример: programers.stackexchange.com/questions/16528/… – Mike Pelley 25 August 2011 в 20:08
  • 2
    Кроме того, всегда использование брекетов делает код гораздо более удобным слиянием. В противном случае у вас гораздо больше шансов получить конфликты, которые необходимо обработать вручную. – hlovdal 14 December 2012 в 08:27
  • 3
    Есть неисчислимые случаи ошибок, возникших из-за отсутствия фигурных скобок. Я согласен, что они уродливы для одной строки, но когда вы заменяете вызов функции макросом - как это иногда бывает из-за особых ограничений - или когда программа реорганизуется для замены выражения одной строки более длинным набором выражений, ошибки могут не быть быть незамедлительно очевидным и происходить только в тех особых случаях, которые не могут быть автоматически проверены. Кудрявые фигурные скобки также являются жестким требованием в некоторых компаниях (у меня это было у военной контрактной компании) даже для 1 лайнеров. – Coyote 10 May 2013 в 14:48
  • 4
    MISRA явно запрещает удаление этих "дополнительных" брекеты. – Toby 8 July 2015 в 08:38

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

46
ответ дан user10392 20 August 2018 в 21:57
поделиться
  • 1
    Вау! Вряд ли это может быть, но это единственный мотив, который я когда-либо слышал для привычки, которая не составляет «о, ну, может быть, кто-то, возможно, подумал, что это может выглядеть лучше или быть более последовательным», ничто из того, что когда-либо казалось даже отдаленно привлекательным для меня. Спасибо вам за это немного здравомыслия! – AmigoNico 19 June 2013 в 03:18
  • 2
    Интересное наблюдение. В моем эксперименте я заметил, что макрос, определенный для return , кажется, разрешает макрокоманды без парсеров, но макрос, определенный для другого имени (например, square ), нет. Кажется, я на этот раз смотрел в бездну ... – Alain O'Dea 29 August 2015 в 15:20
  • 3
    ... лучше надеяться, что никто не вызывает функцию или не использует приращение оператора или не имеет каких-либо других побочных эффектов в своих операциях возврата. – Carl Norum 29 September 2016 в 18:18
  • 4
    Это сильный аргумент, чтобы не использовать круглые скобки для операторов return – nowox 7 December 2017 в 11:54
  • 5
Другие вопросы по тегам:

Похожие вопросы: