Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
A.doc
Скачиваний:
36
Добавлен:
09.04.2015
Размер:
5.6 Mб
Скачать

44 Глава 2

Второй из трех операторов вывода распространяется на две строки:

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

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

Третий и последний оператор вывода просто посылает на экран еще один символ новой строки. Так эти три оператора формируют вывод программы, который вы и наблюдаете.

Последний оператор программы выглядит следующим образом:

Этот оператор прекращает выполнение функции main () и завершает программу. Управление возвращается операционной системе. Об этом операторе будет рассказа- но позже.

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

Пробелы

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

Посмотрим, к примеру, на следующий оператор:

Должен быть, по крайней мере, один пробельный символ (обычно — пробел) меж- ду int и fruit, чтобы компилятор мог различить их, но если пробелов будет больше, они игнорируются.

С другой стороны, взгляните на такой оператор:

Данные, переменные и вычисления 45

Ни один пробельный символ не является необходимым между fruit и =, или меж- ду = и apples, хотя при желании вы можете их включить сюда. Дело в том, что = — это не буква и не цифра, поэтому компилятор может отделить его от окружения. Аналогично никакие пробельные символы не нужны вокруг знака + , но вы можете включить их, если хотите сделать код более читабельным.

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

Блоки операторов

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

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

Автоматически сгенерированные консольные программы

В последнем примере вы настроили проект как пустой (Empty project), без исхо- дных файлов, а затем последовательно добавили их. Если же вы позволите мастеру Application Wizard сгенерировать проект, как это делалось в главе 1, то проект изна- чально будет содержать несколько файлов, и вам стоит немного глубже разобраться в их содержимом. Создайте новый проект консольной программы Win32 по имени , на этот раз позволив мастеру Application Wizard сделать свою работу, не устанавливая никаких опций в диалоге Application Settings (Настройки приложения). Проект будет включать в себя три файла с кодом:, со-

держащие исходный код, и заголовочный файл. Они предназначены для

обеспечения базовых средств, необходимых работающей консольной программе, ко- торая не делает ничего. Если у вас есть открытый проект, вы можете закрыть его, вы- брав пункт меню File^Close Solution (Файл1^Закрыть решение). Вы можете создать новый проект, не закрывая старый — при этом он будет закрыт автоматически, если только вы не предпочтете добавить новый к существующему решению. Прежде всего, содержимоебудет таким:

Это совершенно отличается от предыдущего примера. Присутствует директива #include для заголовочного файла stdaf x.h, которой не было в предыдущей вер- сии, и функция, с которой начинается выполнение программы, называется tmain (), а не main ().

Мастер Application Wizard сгенерировал заголовочный файл stdaf х. h как часть проекта, и если вы заглянете в его код, то увидите там еще две директивы #include для заголовочных файлов стандартной библиотеки stdio. h и tchar. h. stdio. h — за- головок старого стиля для ввода-вывода, который использовался до появления те- кущего стандарта ISO/ANSI С++. Он обеспечивает ту же функциональность, что и <iostream>. Второй файл, tchar .h, является специальным заголовочным файлом Microsoft, определяющим некоторые текстовые функции. Идея в том, что stdaf x.h должен определять набор стандартных системных включаемых файлов для вашего проекта, в который директивой #include вы можете включать любые другие систем- ные заголовочные файлы, которые понадобятся. При изучении ISO/ANSI С++ вам не придется использовать ни один из включенных в stdafх.h заголовочных файлов, что является одной из причин того, чтобы не применять средств генерации файлов по умолчанию мастером Application Wizard.

Как я ранее объяснял, Visual С++ 2005 поддерживает wmain () как альтернативу main () при написании программ, использующих символы Unicode, wmain () — специ- фичное для Microsoft имя, которое не является частью ISO/ANSI С++. Для поддерж- ки этого заголовок tchar.h определяет имя _tmain таким образом, что оно обычно заменяется main, но при определении символа _UNIC0DE заменяется wmain. То есть для того, чтобы идентифицировать программу, использующую UNICODE, вы должны добавить следующий оператор в начало заголовочного файла stdaf x.h:

♦define _UNIC0DE

Разобравшись во всем этом, мы можем вернуться к использованию простой старой функции main () в последующих примерах для ISO/ANSI С++.

Определение переменных

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

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

В следующем разделе мы поговорим о правилах именования переменных при объявлении их в программах.

Данные, переменные и вычисления 47

Именование переменных

Имя, которое вы присваиваете переменной, называется идентификатором, или проще — именем переменной. Имена переменных могут включать буквы A-z (в верхнем или нижнем регистре), цифры 0-9 и знаки подчеркивания. Никакие дру- гие символы не допускаются, и если вы нечаянно укажете какой-то другой символ, то получите сообщение об ошибке при попытке скомпилировать программу. Имена переменных должны начинаться либо с буквы, либо с подчеркивания. Обычно выбор имен переменных обусловлен видом хранимой в них информации.

Поскольку имена переменных в Visual С++ 2005 могут иметь длину до 2048 сим- волов, вам предоставляется достаточно свободы в именовании ваших переменных. Фактически, помимо переменных есть несколько других вещей в С++, которые име- ют собственные имена, и они тоже могут содержать до 2048 символов, подчиняясь тем же правилам, что и имена переменных. Применение имен максимальной длины может затруднить чтение ваших программ, и если только у вас нет изумительных на- выков работы на клавиатуре, их очень трудно набирать. Но более серьезное обстоя- тельство, которое следует принять во внимание при выборе имен — это то, что не все компиляторы поддерживают такие длинные имена. Если вы намереваетесь компили- ровать свой код в других средах, то желательно ограничиться именами не длиннее 31 символа. Обычно этого достаточно, чтобы выбирать осмысленные значащие имена, и позволяет избежать проблем, связанных с ограничениями на длину имен, присущи- ми другим компиляторам.

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

Ниже представлены примеры хороших имен переменных.

Имена вроде 8_Ball, 7Up и б_раск не допускаются, равно как и Hash! или МагS-Ann. Последний пример демонстрирует распространенную ошибку, хотя имя MaryAnn со знаком подчеркивания вместо тире вполне приемлемо. Конечно, Магу Ann — тоже неправильно, поскольку пробелы в именах переменных не разрешены. Обратите внимание, что имена переменных republican и Republican трактуются как различные, потому что имена переменных зависят от регистра, то есть символы верхнего и нижнего регистра различаются. Конечно, пробельные символы вообще не могут появляться в именах, и если вы нечаянно включите пробельные символы, то получите два или более имен вместо одного, что обычно заставляет компилятор выдавать соответствующее сообщение.

Обычное соглашение, принятое в С++, заключается в том, что имена, начинающи- еся с заглавных букв, резервируются для именования классов, а начинающиеся с про- писных — для именования переменных. О классах речь пойдет в главе 8.