
В программистской практике регулярно случается ситуация, когда на время разработки и отладки требуется включать какой-то код и выключать другой. Это несложно делать специальными конструкциями типа
#if true ... #else ... #endif
, меняя true
на false
, или прибегая к более изощренным условиям. В языках, поддерживающих комментарий типа
/* ... */
c помощью слегка нестандартной конструкции /**/ ... /*/ ... /*/ ... /**/
можно создавать сколько угодно чередующихся участков кода, которые будут попеременно включаться и выключаться одним лишь пробелом в первом (стартовом) из комментариев.Например:
/**/
Console.Write("1");
/*/
Console.Write("2");
/*/
Console.Write("3");
/*/
Console.Write("4");
/**/
Console.Write("5");
При выполнении этот код выведет в консоль строку
"135"
. То есть, будут выполнены все нечетные операторы вывода — и последний, находящийся уже за пределами всей конструкции. Но если в стартовом комментарии между второй звездочкой и слешем вставить пробел (или, строго говоря, любой символ, кроме звездочки), то тот же самый код выведет строку "245"
: будут выполнены только четные операторы, и, опять же, последний, который уже за пределами. (UPD: благодарю FluffyMan за указание на ошибку).Синтаксис комментариев-разделителей предельно строг: к конструкции
/*/
ничего ни убавить, ни прибавить нельзя, это разрушит ее функционал. Синтаксис стартового и стопового комментария напротив совершенно произволен. Он может быть минималистичен до /**/
, а может содержать какие угодно — легальные в смысле языка — комментарии. Откуда ясно, что стартовый и стоповый комментарии строго обязательны, и что внутри самой конструкции просто так использовать легальный комментарий типа /* ... */
нельзя, т.к. он тут же станет стоповым для всей предыдущей последовательности комментариев-разделителей /*/
, и стартовым для всей последующей их последовательности. Но осмысленное использование таких вставок может оказаться полезным.Однострочные комментарии
//
на функционал не влияют.Dixi :)