Задания в части условий условные плохая практика?

Позвольте'ы предположим, я хочу написать функцию, которая объединяет две строки в C. Кстати я хотел бы написать это:

в <!-- язык-всем: Лэнг-с - - >

void concat(char s[], char t[]){
    int i = 0;
    int j = 0;

    while (s[i] != '\0'){
        i++;
    }

    while (t[j] != '\0'){
        s[i] = t[j];
        i++;
        j++;
    }

    s[i] = '\0';

}

Однако, к&Р в своей книге реализован он по-разному, в частности, включив в условие цикла while, как это возможно:

void concat(char s[], char t[]){
    int i, j;
    i = j = 0;
    while (s[i] != '\0') i++;

    while ((s[i++]=t[j++]) != '\0');

}

Какой путь предпочтительнее? Это поощряется или порицается писать код пути к&Р делать? Я полагаю, что мой вариант будет проще читать другие люди.

Комментарии к вопросу (10)

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

любой дурак может написать код, который компьютер может понять. Хорошо программисты пишут код, который люди могут понять. (М. Фаулер)

Поэтому, без сомнения, Я'пойду варианта A. И это мой окончательный ответ.

Комментарии (17)

Золотое правило, как и в Tulains сórdova'ы ответ, убедитесь, писать внятный код. Но я Дон'т согласен с заключением. То самое золотое правило-это писать код, что типичный программист, который будет в конечном итоге поддерживать ваш код можно понять. И вы самый лучший судья в том, кто типичный программист, который будет в конечном итоге поддерживать ваш код.

Для программистов, которые не'т начать с C, первый вариант, наверное, проще понять, по причинам, которые вы уже знаете.

Для тех, кто вырос в этом стиле C, то второй вариант может быть гораздо проще, чтобы понять: для них это'ы также можно понять, что код делает, для них, он оставляет меньше вопросов, почему это's написано так оно и есть, и в них меньше вертикального пространства означает, что все связи могут быть отображены на экране.

Вы'придется полагаться на собственный здравый смысл. На какую аудиторию вы хотите сделать ваш код проще для понимания? Это код, написанный для компании? Тогда целевая аудитория является, вероятно, другие программисты в этой компании. Это проект личного хобби что никто не будет работать на себя? Тогда вы сами себе целевую аудиторию. Это код, который вы хотите поделиться с другими? Затем те и другие являются вашей целевой аудиторией. Выберите версию, которая соответствует этой аудитории. К сожалению, нет единого предпочтительный способ поощрения.

Комментарии (0)

Редактировать: в соответствии с[Я] = '\0';` был добавлен к первой версии, тем самым фиксируя его, как описано в варианте 1 ниже, так что это не'т относятся к текущей версии вопрос's код больше.

Вторая версия имеет отличительные преимущества правильно, в то время как первый не - это не нуль-правильно расторгнуть целевой строке.

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

  1. добавить нулем после окончания второго цикла (добавлять больше кода, но вы можете возразить, readabiliy целесообразно) или
  2. измените тело цикла, чтобы "сначала назначить, тогда и индексами прироста и quot просмотреть или сохранить назначенные чар;. Проверка состояния в середине цикла, означает выход из цикла (снижение ясности, не одобряется большинство пуристов). Сохранение назначенного чар будет означать, введя временную переменную (уменьшение ясности и эффективности). Оба эти уничтожить преимущество на мой взгляд.
Комментарии (1)

Ответы на Tulains сórdova и ХВД крышка ясности/читабельность аспекты достаточно хорошо. Пусть в меня бросят в обзорный как еще один довод в пользу назначения в условиях. Переменная, объявленная в состоянии доступен только в рамках, что инструкции. Вы не можете использовать эту переменную потом случайно. Для петли делал это в течение веков. И это достаточно важно, что предстоящие в C++17 представляет подобный синтаксис для Если и переключатель:

if (int foo = bar(); foo > 42) {
    do_stuff();
}

foo = 23;   // compiler error: foo is not in scope
Комментарии (0)

Нет. Это очень стандартный и обычный стиль c. Ваш пример-это плохо, потому что это должно быть просто цикл for, но в целом там's ничего плохого

if ((a = f()) != NULL)
    ...

например (или во время).

Комментарии (13)

Оба стиля хорошо сформирован, правильной и адекватной. Какой из более уместен во многом зависит ваша компания's стиль руководства. Современные IDE будет способствовать использование обоих стилей с помощью видео проверка синтаксиса, который четко выделить области, которые могли бы стать источником путаницы.

Например, следующее выражение подсвечивается в NetBeans:

в

if($a = someFunction())

на основании "и случайное задание на".

Чтобы явно сказать, что NetBeans, что "Да, я действительно хотел сделать, что..." Ну, это выражение может быть обернут в скобки.

if(($a = someFunction()))

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

Комментарии (0)

В дни к&Р

  • ‘C’ был портативный ассемблерный код
  • Она была использована программистами, которые думали, что в ассемблерный код
  • Компилятор не сделал много оптимизации
  • Большинство компьютеров были “сложные наборы инструкций”, например, в то время как ((с[я++]=т[Дж++]) != '\0')` будет сопоставлять одну инструкцию на большинстве процессоров (я ожидаю, что ВПТ декабря)

Дней

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

(Примечание На всегда с помощью брекет-системы – 1-й набор кода занимает больше места из-за наличия какой-то “ненужные” {}, по моему опыту они часто предотвратить код, который был сильно слился от компилятора и допускать ошибки с неверными “;” размещений, чтобы быть обнаружены с помощью инструментов.)

Однако в старые времена 2-ой версии код будет читать. (Если я правильно понял!)

concat(char* s, char *t){      
    while (*s++);
    --s;
    while (*s++=*t++);
}
Комментарии (0)

Даже будучи в состоянии сделать это на всех-это очень плохая идея. Это'ы в просторечии известный как "Мир's последняя ошибка:" Ну вот так:

if (alert = CODE_RED)
{
   launch_nukes();
}

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

Комментарии (4)