Программирование
Добавить в закладки К обложке
- 1. Системы программирования - Страница 1
- 2. Классификация языков программирования высокого уровня - Страница 2
- 3. Переменные Visual Basic - Страница 3
- 4. Типы переменных - Страница 4
- 5. Целочисленные, переменного типа и переменные данных - Страница 5
- 6. Объявление переменных: оператор Dim для различных типов данных - Страница 6
- 7. Изменение значений по умолчанию для типов, область видимости - Страница 7
- 8. Используемые символы языка СИ - Страница 8
- 9. Константы языка СИ - Страница 9
- 10. Примеры использования констант языка СИ - Страница 10
- 11. Идентификатор. Ключевые слова - Страница 11
- 12. Комментарии. Исходные файлы - Страница 12
- 13. Область видимости - Страница 13
- 14. Объявление переменной на внутреннем уровне с классом памяти static - Страница 14
- 15. Объявление переменной, которая служит именем внешнего массива - Страница 15
- 16. Методы доступа к элементам массивов - Страница 16
- 17. Директивы препроцессора - Страница 17
- 18. Применение директив - Страница 18
- 19. Рекурсия - Страница 19
- 20. Знакомство с языком СИ++ - Страница 20
- 21. Комментарии в СИ++ - Страница 21
- 22. Соотношение между основными типами данных в СИ++ - Страница 22
- 23. Операции языка СИ++ - Страница 23
- 24. Оператор выражение. Пустой оператор - Страница 24
- 25. Оператор switch, break. Копирование строки - Страница 25
- 26. Описание функций - Страница 26
- 27. Исходные файлы С++ - Страница 27
- 28. Описание - Страница 28
- 29. Описание и скрытие имен - Страница 29
- 30. Имена переменных - Страница 30
- 31. Разыменование - Страница 31
- 32. Ссылка - Страница 32
- 33. Выражения и операторы - Страница 33
- 34. Функции и файлы - Страница 34
- 35. Классы - Страница 35
- 36. Перегрузка операций - Страница 36
- 37. Производные классы - Страница 37
- 38. Потоки - Страница 38
- 39. Инспектор объектов для языка Дельфи - Страница 39
- 40. Окно редактора кода Дельфи - Страница 40
- 41. Сообщения Дельфи - Страница 41
- 42. Оптимизация по быстродействию в Ассемблер - Страница 42
- 43. Оптимизация по размеру в Ассемблер - Страница 43
- 44. Достоинства и недостатки оптимизации - Страница 44
- 45. Отказ от универсальности - Страница 45
- 46. Оптимизация переходов и вызовов подпрограмм - Страница 46
- 47. Оптимизация циклов - Страница 47
- 48. Управляющие таблицы - Страница 48
- 49. Оптимизация для конкретных моделей процессоров - Страница 49
- 50. Органы управления (controls) Active X - Страница 50
- 51. Синтаксис Active X - Страница 51
- 52. Практикум Active X - Страница 52
- 53. Сценарии и документы - Страница 53
- 54. Netscape Navigator - Страница 54
- 55. Понятие системы VВА - Страница 55
- 56. Язык программирования VВА - Страница 56
33. Выражения и операторы
C++ обладает небольшим, но гибким набором различных видов операторов для контроля потока управления в программе и богатым выбором операций для управления данными.
То есть программа представляет собой последовательность строк. Каждая строка включает в себя одно или более выражений, разделенных запятой. Основными элементами выражения служат числа, имена и операции *, /, +, – (унарный и бинарный) и =. Имена не всегда описываются до использования.
Применяемый метод синтаксического анализа обычно именуется рекурсивным спуском; это популярный и простой нисходящий метод. В таком языке, как C++, в котором вызовы функций вполне дешевы, кроме того, данный метод эффективен. Для любого правила вывода грамматики существует функция, вызывающая другие функции. Терминальные символы (например, END, NUMBER, + и —) определяются лексическим анализатором gettoken(), а нетерминальные символы определяются функциями синтаксического анализа expr(), term() и prim().
Программа разбора для обнаружения ввода применяет функцию gettoken(). Значение вызова gettoken() определяется в переменной currtok; currtok принимает одно из значений перечисления tokenvalue.
В любой функции разбора предполагается, что было обращение к gettoken() и в currtok располагается очередной символ, подлежащий анализу. Это дает возможность программе разбора заглядывать на один лексический символ вперед и вынуждает функцию разбора читать на одну лексему больше, чем применяется правилом, для обработки которого она была вызвана. Каждая функция разбора определяет «свое» выражение и возвращает значение. Функция expr() обрабатывает сложение и вычитание; она включает в себя простой цикл, который обнаруживает термы для сложения или вычитания.
Сама функция делает мало. В манере, которая типична для функций более высокого уровня в громоздких программах, она вызывает для осуществления работы другие функции.
Обработка ошибок в программах С++ не составляет большого труда. Функция обработки ошибок просто определяет ошибки, пишет сообщение об ошибке и возвращает управление обратно:
Возвращение производится потому, что ошибки чаще всего встречаются в середине вычисления выражения, и поэтому следует или полностью прекращать вычисление, или возвращать значение, которое не должно привести к последующим ошибкам. Для обычного калькулятора больше подходит последнее. Если бы gettoken() обнаруживала номера строк, то error() сообщала бы, где приблизительно обнаружена ошибка. Это было бы полезно, если бы калькулятор применялся неинтерактивно.
Когда все части программы разделены, необходим только драйвер для инициализации и того, что связано с запуском. Например:
Принято обычно, что main() возвращает ноль при обычном завершении программы и не ноль в противном случае, поэтому это прекрасно осуществляет возвращение числа ошибок.