Правило приоритета == над = - PullRequest
2 голосов
/ 29 апреля 2010

Мне просто интересно, было бы лучше сделать это:

if((fd = open(filename, O_RDWR)) == -1)
{
fprintf(stderr, "open [ %s ]\n", strerror(errno));

return 1;
}

или это

fd = open(filename, O_RDWR);
if(fd == -1)
{
    fprintf(stderr, "open [ %s ]\n", strerror(errno));

    return 1;
}

Большое спасибо за любые предложения,

Ответы [ 10 ]

12 голосов
/ 29 апреля 2010

Тьфу, разделить это. Что вы получаете, затирая все это в одну строку? Давайте сравним и сопоставим:

Однострочный:

  • Преимущества:
  • Недостатки: плохо читается, подвержен ошибкам. (Рассмотрим вашу первую ревизию.)

Многострочный:

  • Преимущества: Легко читается, менее подвержен ошибкам.
  • Недостатки:

Я думаю, это понятно. :)


«Иногда более целесообразно помещать их в одну строку, например: while ((c=getchar())!=EOF)»

Хорошо, но это не тот случай. бывают случаи, когда неразделение имеет смысл, но в общем , не надо.


"Это экономит больше вертикального пространства"

Если одна строка убивает вашу способность видеть функцию, вам нужно: 1) купить монитор с разрешением выше 640x480 и 2) написать меньшие функции.

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


"Несколько линий делают его сложным"

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

6 голосов
/ 29 апреля 2010

Несколько человек высказались за второе. Я не согласен с ними. Хотя изначально (очевидно) была небольшая проблема с = против == в первой, я бы сказал, что это небольшая проблема.

Гораздо более серьезная проблема заключается в том, что люди слишком часто (особенно если они спешат) слишком часто пропускают проверку ошибок - полностью исключая if (whatever == -1), обычно по теории, что они работать быстро, одноразовый код и проверка на наличие ошибок на самом деле не нужны. Это действительно плохая привычка; Я могу практически гарантировать, что каждый человек, читающий это, видел настоящий код, который пропускал проверку ошибок, как это, хотя он действительно, действительно должен был иметь это.

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

Оправдания за то, чтобы поступить иначе, на мой взгляд, довольно слабые. Реальность такова, что любой, кто использует C , нуждается в , чтобы иметь возможность читать код, который сочетает в себе назначение с условным тестом. Просто для наглядного примера, цикл вроде while ((ch=getchar()) != EOF) в значительной степени требует, чтобы был написан как комбинированное присваивание и тестирование - попытка проверить EOF отдельно обычно приводит к коду, который просто не работает правильно, и если вы сделаете так, чтобы он работал правильно, код будет значительно сложнее.

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

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

3 голосов
/ 29 апреля 2010

В этом примере я присоединюсь к хору, говоря, что второй метод лучше.

Более сложный случай, когда он находится в цикле, например:

while ((c=getchar())!=-1)
{
  ... do something ...
}

против

while (true)
{
  c=getchar();
  if (c==-1)
    break;
  ... do something ...
}

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

3 голосов
/ 29 апреля 2010

Может быть, что-то, где скобки делают порядок очевидным?

if((fd = open(filename, O_RDWR)) == -1)
2 голосов
/ 29 апреля 2010

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

2 голосов
/ 29 апреля 2010

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

2 голосов
/ 29 апреля 2010

Это стиль - вы не просите прецедент (не президентство).

Многие люди утверждают, что последний пример более ясен.

1 голос
/ 29 апреля 2010

Это вопрос стиля и субъективен. Они делают то же самое. Я предпочитаю последнее, потому что мне легче читать и легче устанавливать контрольные точки / проверять переменные в отладчике.

0 голосов
/ 29 апреля 2010

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

while ( (ch=getchar()) != -1){
  //do something with it
}

Я думаю, что второй способ более нормален для оператора if, когда у вас нет такой же проблемы.

0 голосов
/ 29 апреля 2010
(-1 == __whatever__) 

чтобы минимизировать опечатку

...