Новые книги

Algorithms increasingly run our lives. They find books, movies, jobs, and dates for us, manage our investments, and discover new drugs. More and more, these algorithms work by learning from the trails of data we leave in our newly digital world. Like curious children, they observe us, imitate, and experiment. And in the world’s top research labs and universities, the race is on to invent the ultimate learning algorithm: one capable of discovering any knowledge from data, and doing anything we want, before we even ask.

Machine learning is the automation of discovery-the scientific method on steroids-that enables intelligent robots and computers to program themselves. No field of science today is more important yet more shrouded in mystery. Pedro Domingos, one of the field’s leading lights, lifts the veil for the first time to give us a peek inside the learning machines that power Google, Amazon, and your smartphone. He charts a course through machine learning’s five major schools of thought, showing how they turn ideas from neuroscience, evolution, psychology, physics, and statistics into algorithms ready to serve you. Step by step, he assembles a blueprint for the future universal learner-the Master Algorithm-and discusses what it means for you, and for the future of business, science, and society.

If data-ism is today’s rising philosophy, this book will be its bible. The quest for universal learning is one of the most significant, fascinating, and revolutionary intellectual developments of all time. A groundbreaking book, The Master Algorithm is the essential guide for anyone and everyone wanting to understand not just how the revolution will happen, but how to be at its forefront.
Скидки и распродажи – всего лишь самые простые и вовсе не самые эффективные методы увеличения объема продаж. В действительности арсенал стимулирования продаж огромен и разнообразен и позволяет разработать не просто промоакции, а настоящие маркетинговые шедевры. Причем некоторые из них – совершенно бесплатно. В этой книге вы найдете много идей для организации ярких промокампаний.

Внешние определения. Справочное руководство по C++

10. Внешние определения

Программа на C++ состоит из последовательности внешних определений. Внешнее определение описывает идентификатор как имеющий класс памяти static и определяет его тип. Спецификатор типа (#8.2) может также быть пустым, и в этом случае принимается тип int. Область видимости внешних определений простирается до конца файла, в котором они описаны, так же, как действие описаний сохраняется до конца блока. Синтаксис внешних определений тот же, что и у описаний, за исключением того, что только на этом уровне и внутри описаний классов может быть задан код (текст программы) функции.

10.1 Определения функций

Определения функций имеют вид

	определение_функции:
	     спецификаторы_описания описатель_функции  opt инициализа-
	тор_базового_класса                                        opt
	     тело_функции

Единственными спецификаторами класса памяти (sc-спецификаторами), допустимыми среди спецификаторов описания, являются extern, static, overload, inline и virtual. Описатель функции похож на описатель "функции, возвращающей ...", за исключением того, что он включает в себя имена формальных параметров определяемой функции. Описатель функции имеет вид

	описатель_функции:
	     описатель ( список_описаний_параметров )

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

Тело функции имеет вид

	тело_функции:
	     составной_оператор
Вот простой пример полного определения функции:
	int max (int a,int b,int c)
	  {
	    int m = (a > b) ? a : b;
	    return  (m > c) ? m : c;
	  }

Здесь int является спецификатором типа ; max (int a, int b, int c) является описателем функции ; { ... } - блок, задающий текст программы (код) оператора.

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

Инициализатор базового класса имеет вид

	инициализатор_базового_класса:
	     : ( список_параметров opt )
Он используется для задания параметров конструктора базового класса в конструкторе производного класса. Например:
	struct base { base (int); ... };
	struct derived : base { derived (int); ... };
	derived.derived (int a) : (a+1) { ... }
	derived d (10);
Конструктор базового класса вызывается для объекта d с параметром 11.

10.2 Определения внешних данных

Определения внешних данных имеют вид

	определение_данных:
	     описание

Класс памяти таких данных статический.

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

11. Правила области видимости

См. #4.1.

12. Командные строки компилятора

Компилятор языка C++ содержит препроцессор, способный выполнять макроподстановки, условную компиляцию и включение именованных файлов. Строки, начинающиеся с #, относятся к препроцессору. Эти строки имеют независимый от остального языка синтаксис; они могут появляться в любом месте оказывать влияние, которое распространяется (независимо от области видимости) до конца исходного файла программы.

Заметьте, что определения const и inline дают альтернативы для большинства использований #define.

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

Командная строка компилятора имеет вид

	#define идент строка_символов
вызывает замену препроцессором последующих вхождений идентификатора, заданного строкой символов. Точка с запятой внутри (или в конце) строки символов является частью этой строки.

Строка вида

	#define идент( идент , ..., идент ) строка_символов
где отсутсвует пробел между первым идентификатором и (, является макроопределением с параметрами. Последующие вхождения первого идентификатора с идущими за ним (, последовательностью символов, разграниченной запятыми, и ), заменяются строкой символов, заданной в определении. Каждое местоположение идентификатора, замеченного в списке параметров определения, заменяется соответствующей строкой из вызова. Фактическими параметрами вызова являются строки символов, разделенные запятыми; однако запятые в строке, заключенной в кавычки, или в круглых скобках не являются разделителями параметров. Число формальных и фактических параметров должно совпадать. Строки и символьные константы в символьной строке сканируются в поисках формальных параметров, но строки и символьные константы в остальной программе не сканируются в поисках определенных (с помощью define) идентификаторов.

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

Командная строка вида

	#undef идент
влечет отмену препроцессорного определения идентификатора.

12.2 Включение файлов

Командная строка компилятора вида

	#include "имя_файла"
вызывает замену этой строки полным содержимым файла имя_файла. Сначала именованный файл ищется в директории первоначального исходного файла, а затем в стандартных или заданных местах. Альтернативный вариант, командная строка вида
	 #include <имя_файла>
производит поиск только в стандартном или заданном месте, и не ищет в директории первоначального исходного файла. (То, как эти места задаются, не является частью языка.)

Включения с помощью #include могут быть вложенными.

12.3 Условная компиляция

Командная строка компилятора вида

	#if выражение
проверяет, является ли результатом вычисления выражения не-ноль. Выражение должно быть константным выражением, которые обсуждаются в #15; применительно к использованию данной директивы есть дополнительные ограничения: константное выражение не может содержать sizeof или перечислимые константы. Кроме обычных операций C может использоваться унарная операция defined. В случае применения к идентификатору она дает значение не-ноль, если этот идентификатор был ранее определен с помощью #define и после этого не было отмены определения с помощью #undef; иначе ее значение 0.

Командная строка вида

	#ifdef идент
проверяет, определен ли идентификатор в препроцессоре в данный момент; то есть, был ли он объектом командной строки #define.

Командная строка вида

	#ifndef идент
проверяет, является ли идентификатор неопределенным в препроцессоре в данный момент.

После строки каждого из трех видов может стоять произвольное количество строк, возможно, содержащих командную строку

	#else
и далее до командной строки
	#endif

Если проверенное условие истинно, то все строки между #else и #endif игнорируются. Если проверенное условие ложно, то все строки между проверкой и #else или, в случае отсутствия #else, #endif, игнорируются.

Эти конструкции могут быть вложенными.

12.4 Управление строкой

Для помощи другим препроцессорам, генерирующим программы на C, строка вида

	#line константа "имя_файла"
заставляет компилятор считать, например, в целях диагностики ошибок, что константа задает номер следующей строки исходного файла, и текущий входной файл именуется идентификатором. Если идентификатор отсутствует, то запомненное имя файла не изменяется.

13. Неявные описания

См. #8.1.

Назад | Содержание | Вперед