рекламная строчка Nolix

четверг, 9 апреля 2020 г.

Как изобрели чайные пакетики

Чай в пакетиках
Оказывается, изобретение чайных пакетиков было результатом ошибки. Торговец чаем Томас Саливан, желая сократить расходы, однажды решил попробовать разместить некоторое количество чая в дешевых марлевых пакетиках вместо металлических коробок. В таком виде он осуществил поставку чая в торговые сети. Продавцы чая, увидев чай в марлевых пакетах, подумали, что в таком виде и предполагалось заваривать чай. Они сделали это и результат им понравился, ведь это оказалось отличным способом избавиться от чайной заварки. После этого они попросили Томаса рекламировать чайные пакетики. Это произошло в 1904 году.
Не пейте чай в пакетиках!

понедельник, 6 апреля 2020 г.

Директива #if в языке С

Об одном нюансе относительно использования директивы #if почему-то редко пишут в учебниках, поэтому на этом нюансе нередко спотыкаются новички. В этой статье мы рассмотрим этот нюанс.
Напомним, что директива #if является одной из директив препроцессора в языке С (как и, само собой, в языке С++). Вспомним также, что препроцессор - это программа, которая занимается подготовкой кода, написанного программистом, к компиляции. То есть тот код, который будет скомпилирован и впоследствии будет выполнятся при запуске программы, зависит от того, как отработает препроцессор.
Существует понятие условная компиляция. Суть его заключается в том, что в зависимости от некоторых условий будет скомпилирован тот или иной код. И вот одной из директив (по- простому говоря, команд) условной компиляции и является директива #if.
Синтаксис этой директивы такой:

#if константное_выражение последовательность операторов #endif
Если константное_выражение имеет ненулевое значение, тогда выполняется последовательность операторов.
Часто в учебниках не упоминают о том, что это константное_выражение обязательно должно быть целочисленным. И совсем редко пишут о том, что в этом константном выражении не могут использоваться целочисленные константы.
Напомним, что именованные константы - это такие константы, которые объявляются с применением спецификатора const, например, так:

const int M = 10;
Почему же нельзя в выражении, стоящем после #if, использовать именованные константы? Потому что директива #if используется еще на этапе препроцессинга, а компьютер на этом этапе еще не знает, что некоторая константа (например, вышеупомянутая M) имеет значение, например, 10. Поэтому такая программка (см. ниже) не приведет к выводу на экран текста "It's OK", как мог бы ожидать автор этого кода.

int main()
{
         const int M = 10;
         #if M == 10
                 cout << "It's OK\n";
        #endif
}


Для решения проблемы достаточно задать константу M другим способом - с помощью директивы #define:

#define M 10
int main()
{
    #if M == 10
          cout << "It's OK\n";
    #endif
}