1.2 – Комментарии в C++

Добавлено 31 марта 2021 в 00:17

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

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

Однострочные комментарии

Однострочный комментарий C++ начинается с символов //, которые указывают компилятору игнорировать всё, от символов // до конца строки. Например:

std::cout << "Hello world!"; // Всё отсюда до конца строки игнорируется

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

std::cout << "Hello world!\n"; // std::cout живет в библиотеке iostream
std::cout << "It is very nice to meet you!\n"; // эти комментарии затрудняют чтение кода
std::cout << "Yeah!\n"; // особенно когда строки разной длины

Наличие комментариев справа от строки может затруднить чтение и кода, и комментария, особенно если строка длинная. Если строки достаточно короткие, комментарии можно просто выровнять (обычно по позиции табуляции), например:

std::cout << "Hello world!\n";                 // std::cout живет в библиотеке iostream
std::cout << "It is very nice to meet you!\n"; // это намного легче читать
std::cout << "Yeah!\n";                        // вам так не кажется?

Однако, если строки длинные, размещение комментариев справа может сделать ваши строки очень длинными. В этом случае однострочные комментарии часто помещаются над строкой, которую они комментируют:

// std::cout живет в библиотеке iostream
std::cout << "Hello world!\n";
 
// это намного легче читать
std::cout << "It is very nice to meet you!\n";
 
// вам так не кажется?
std::cout << "Yeah!\n";

Примечание автора


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

Если вы хотите скомпилировать фрагмент кода, вам нужно превратить его в полную программу, чтобы она могла скомпилироваться. Обычно эта программа будет выглядеть примерно так:

#include <iostream>
 
int main()
{
    // Замените эту строку фрагментом кода, который вы хотите скомпилировать
 
    return 0;
}

Многострочные комментарии

Пары символов /* и */ отмечают многострочный комментарий в стиле C. Всё, что находится между этими символами, игнорируется.

/* Это многострочный комментарий.
   Эта строка будет проигнорирована.
   И эта тоже. */

Поскольку всё, что находится между этими символами, игнорируется, вы иногда можете увидеть, как программисты «украшают» свои многострочные комментарии:

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

Комментарии в многострочном стиле не могут быть вложенными. Следовательно, результаты следующего кода могут быть неожиданными:

/* Это многострочный /* комментарий */ не внутри комментария */
// Приведенный выше комментарий заканчивается первым */, а не вторым */

Когда компилятор попытается скомпилировать этот код, он проигнорирует все, от первого /* до первого */. Поскольку фрагмент «это не внутри комментария */» не считается частью комментария, компилятор попытается скомпилировать его. Это неизбежно приведет к ошибке компиляции.

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

Предупреждение


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

Правильное использование комментариев

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

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

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

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

/* Чтобы подсчитать итоговую оценку, мы суммируем все взвешенные промежуточные
   баллы и баллы за домашнее задание, а затем делим на количество баллов, 
   чтобы определить процент, который используется для расчета буквенной оценки. */
// Чтобы сгенерировать случайный элемент, мы сделаем следующее:
// 1) помещаем все элементы необходимой редкости в список;
// 2) рассчитываем вероятность для каждого элемента на основе уровня и весового коэффициента;
// 3) выбираем случайное число;
// 4) выясняем, какому элементу соответствует это случайное число;
// 5) возвращаем соответствующий элемент.

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

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

Вот несколько примеров плохих комментариев к строке и хороших комментариев к инструкции.

Плохой комментарий:

// Устанавливаем дальность прицела на 0
sight = 0;

Причина: мы уже видим, что прицел (sight) устанавливается на 0, посмотрев на инструкцию.

Хороший комментарий:

// Игрок только что выпил зелье слепоты и ничего не видит
sight = 0;

Причина: теперь мы знаем, почему прицел игрока установлен на 0.

Плохой комментарий:

// Рассчитываем стоимость предметов
cost = quantity * 2 * storePrice;

Причина: мы видим, что это расчет стоимости, но почему количество умножается на 2?

Хороший комментарий:

// Здесь нам нужно умножить количество на 2, потому что они покупаются парами
cost = quantity * 2 * storePrice;

Причина: Теперь мы знаем, почему эта формула имеет смысл.

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

Хорошие комментарии:

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

Наконец, комментарии должны быть написаны таким образом, чтобы иметь смысл для тех, кто не знает, что делает код. Часто программист говорит: «Совершенно очевидно, что он делает! Я ни за что не забуду об этом,». Угадайте, что? Это не очевидно, и вы удивитесь, как быстро вы забудете. :) Вы (или кто-то другой) поблагодарите вас позже за то, что вы написали, что, как и почему делается в вашем коде на человеческом языке. Читать отдельные строки кода легко. Понимание того, для чего они предназначены, – нет.

Лучшая практика


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

Примечание автора


На протяжении всей остальной части этой серии руководств мы будем использовать комментарии внутри фрагментов кода, чтобы привлечь ваше внимание к конкретным вещам или помочь проиллюстрировать, как всё работает (обеспечивая при этом компиляцию программ). Проницательные читатели заметят, что по вышеуказанным стандартам большинство этих комментариев ужасны. :) Читая остальные руководства, имейте в виду, что комментарии служат намеренно образовательной цели, а не пытаются продемонстрировать, как выглядят хорошие комментарии.

Закомментирование кода

Преобразование одной или нескольких строк кода в комментарий называется закомментированием кода. Это предоставляет удобный способ (временно) исключить фрагменты вашего кода из включения в скомпилированную программу.

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

Незакомментированный код:

    std::cout << 1;

Закомментированный код:

//    std::cout << 1;

Чтобы закомментировать блок кода и временно превратить этот блок кода в комментарий, используйте // в нескольких строках кода или многострочный комментарий /* */.

Незакомментированный код:

    std::cout << 1;
    std::cout << 2;
    std::cout << 3;

Закомментированный код:

//    std::cout << 1;
//    std::cout << 2;
//    std::cout << 3;

или же

/*
    std::cout << 1;
    std::cout << 2;
    std::cout << 3;
*/

Есть несколько причин, по которым вы можете захотеть это сделать:

  1. Вы работаете над новым фрагментом кода, который еще не компилируется, и вам нужно запустить программу. Компилятор не позволит вам скомпилировать код, если есть ошибки компиляции. Комментирование кода, который не компилируется, позволит программе скомпилироватьсь, чтобы вы могли ее запустить. Когда вы будете готовы, вы сможете раскомментировать код и продолжить работу над ним.
  2. Вы написали новый код, который компилируется, но работает некорректно, и у вас нет времени исправить его. Комментирование неработающего кода гарантирует, что он не будет выполняться и не вызовет проблемы, пока вы не исправите его.
  3. Поиск источника ошибки. Если программа не дает желаемых результатов (или дает сбой), иногда может быть полезно отключить части вашего кода, чтобы посмотреть, можете ли вы определить причину, по которой она работает некорректно. Если вы закомментировали одну или несколько строк кода, и ваша программа начинает работать должным образом (или перестает давать сбой), скорее всего, то, что вы в последний раз закомментировали, было частью проблемы. Затем вы можете выяснить, почему эти строки кода вызывают проблему.
  4. Вы хотите заменить один фрагмент кода другим фрагментом кода. Вместо того чтобы просто удалять исходный код, вы можете закомментировать его и оставить для справки, пока не убедитесь, что новый код работает правильно. Убедившись, что ваш новый код работает, вы можете удалить старый закомментированный код. Если вам не удается заставить новый код работать, вы всегда можете удалить новый код и раскомментировать старый код, чтобы вернуться к тому, что было раньше.

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

Для пользователей Visual Studio


Вы можете закомментировать или раскомментировать выделенный фрагмент с помощью меню Правка (Edit) → Дополнительно (Advanced) → Закомментировать выделенный фрагмент (Comment Selection) или Раскомментировать выделенный фрагмент (Uncomment Selection).

Для пользователей Code::Blocks


Вы можете закомментировать или раскомментировать выделенный фрагмент с помощью меню Edit (Правка) → Comment (Комментарий) или Uncomment (Раскомментировать) или Toggle comment (Переключить комментарий) или любой другой инструмент для комментирования.

Совет


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

Если вам нужно закомментировать блок кода, содержащий многострочные комментарии, вы также можете рассмотреть возможность использования директивы препроцессора #if 0, которую мы обсуждаем в уроке «2.9 – Введение в препроцессор».

Резюме

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

Теги

C++ / CppДля начинающихОбучениеПрограммирование

На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.

В случае комментирования в качестве гостя (без регистрации на disqus.com) для публикации комментария требуется время на премодерацию.