
- •1 Компьютер для программиста.
- •12. Пользовательские скалярные типы данных в языках Си
- •13.Структурированые типы данных в языке си
- •14.Арифметические выражения
- •18. Выражения с указателями
- •20.Константные выражения
- •21. Приоритет операций и скобочная структура выражений
- •22. Структура программы на си
21. Приоритет операций и скобочная структура выражений
Приоритеты и порядок вычислений операций языка С влияют на способ группирования и вычисления операндов в выражениях. Приоритет операций имеет смысл только при наличии нескольких операций с разными приоритетами. Выражение с наивысшим приоритетом вычисляется первым.Ниже приведены операции в порядке убывания приоритета. Операции, приведённые на одной строчке, имеют одинаковый приоритет. Операции, помеченные как R→L, имеют правую ассоциативность (то есть при сочетании равноприоритетных операций без скобок они вычисляются справа налево; при этом порядок вычисления аргументов большинства операций не специфицирован и зависит от реализаций):
Постфиксные операции |
[] () . -> ++ -- |
Унарные операции (R→L) |
++ -- & * + - ~ ! sizeof (type) |
Мультипликативные |
* / % |
Аддитивные |
+ - |
Сдвиговые |
<< >> |
Операции сравнения |
< > <= >= |
Операции проверки равенства |
== != |
Побитовые |
& ^ | |
Логические |
&& || |
Условная операция (R→L) |
?: |
Операции присваивания (R→L) |
= *= /= %= += -= <<= >>= &= ^= |= |
Последовательное вычисление |
, |
22. Структура программы на си
Программа на C++ обычно состоит из большого числа исходных файлов, каждый из которых содержит описания типов, функций, переменных и констант. Чтобы имя можно было использовать в разных исходных файлах для ссылки на один и тот же объект, оно должно быть описано как внешнее. Например: extern double sqrt(double); extern instream cin; Самый обычный способ обеспечить согласованность исходных файлов - это поместить такие описания в отдельные файлы, называемые заголовочными (или хэдер) файлами, а затем включить, то есть скопировать, эти заголовочные файлы во все файлы, где нужны эти описания. Например, если описание sqrt хранится в заголовочном файле для стандартных математических функций math.h, и вы хотите извлечь квадратный корень из 4, можно написать: #include //... x = sqrt(4); Поскольку обычные заголовочные файлы включаются во многие исходные файлы, они не содержат описаний, которые не должны повторяться. Например, тела функций даются только для inline-подставляемых функций и инициализаторы даются только для констант. За исключением этих случаев, заголовочный файл является хранилищем информации о типах. Он обеспечивает интерфейс между отдельно компилируемыми частями программы. В команде включения include имя файла, заключенное в угловые скобки, например , относится к файлу с этим именем в стандартном каталоге (часто это /usr/include/CC); на файлы, находящиеся в каких-либо других местах ссылаются с помощью имен, заключенных в двойные кавычки. Например: #include \"math1.h\" #include \"/usr/bs/math2.h\" включит math1.h из текущего пользовательского каталога, а math2.h из каталога /usr/bs. Здесь приводится очень маленький законченный пример программы, в котором строка определяется в одном файле, а ее печать производится в другом. Файл header.h определяет необходимые типы: // header.h extern char* prog_name; extern void f(); В файле main.c находится главная программа:
// main.c #include \"header.h\" char* prog_name = \"дурацкий, но полный\"; main() { f(); }