Арифметические операции
Выражения
План
1. Выражения
2. Арифметические операции
3. Операции отношения и логические операции
4. Операции инкремента и декремента
Домашнее задание: Самостоятельная работа №3
Выражение строится из одной или нескольких операций. Объекты этих операций называются операндами. Операции бывают унарные - которые действуют на один операнд - например унарный минус (-x) и бинарные - которые действуют на два операнда (сложение и т.п. - x+y).
Вычисление выражения состоит в выполнении одной или нескольких операций, приводящих к результату. Тип данных выражения обычно определяется типами его операндов. Когда в выражении присутствует более одного типа данных, то происходит преобразование типа в соответствии с определенными правилами.
Выражение, в котором участвуют две или более операции, называется составным (например, x+y-z). Порядок применения операций определяется приоритетом операции (какая операция выполняется раньше, а какая позже) и ее ассоциативностью (слева направо она выполняется или справа налево).
|
|
Простейшее выражение - просто операнд без операции - т.е. константа или переменная. Например 3.14159 или index. Тип выражения соответствует типу данной константы или переменной.
Бинарными арифметическими операциями являются +, -, *, / а также операция взятия остатка %. Операции *, / и % имеют более высокий приоритет, чем + и - (как и в Паскале). Например, x + y * z трактуется как x + (y*z), что естественно. Если нужно изменить порядок вычислений - то нужно, как и в Паскале, использовать скобки. Есть два отличия от Паскаля
1) Операция % берет остаток (т.е 22 % 6 будет 4) и применима только к целым
2) Если операция / применяется к целым, то результатом деления будет
тоже целое, а остаток отбрасывается (22 / 6 будет 3).
Арифметические операции с одинаковым приоритетом выполняются слева направо.
Есть и унарные операции + и -. Их приоритет выше, чем у бинарных –
-x * y значит (-x) * y a не -(x * y).
Следует заметить, что в результате выполнения арифметических операций
можно выйти за диапазон типа. Например
unsigned char uc = 32, uc1 = 10;
uc = uc * uc1;
В результате uc должно получить значение 320, а верхний диапазон unsigned char, как известно, равен 255. Что при этом будет - зависит от машины.
Сводная таблица с приоритетами
Операция| | Назначение | Использование |
! | | логич. НЕ | ! в |
< | <= | > | >= | | меньше меньше или= больше больше или= | в < в в <= в в > в в >= в |
== | != | | равно не равно | в == в в!= в |
&& | | логич. И | в && в |
|| | | логич. ИЛИ | в || в |
Приоритет операций отношения и логических операций ниже, чем у арифметических операций (i < j+1 трактуется как i < (j+1)).
|
|
Одним из основополагающих идейных отличий С и С++ от Паскаля, так сказать, на повседневном уровне является то, что все операции отношения и логические операции возвращают целое значение -
1 - если условие истинно
0 - если условие ложно
В С нет булевского типа. Логические операции тоже оперируют с целыми величинами, или с величинами, которые можно преобразовать в целые (в том числе и с плавающей точкой). При этом истиной считается любое ненулевое значение, а ложью - ноль. Отсюда ясно, что функция, возвращающая целое или приводимое к целому значение и вообще любое выражение, приводимое к целому, может в С использоваться в логических условиях.
Логические операции && и || аналогичны по принципу действия паскалевским and и or. Результат && - истина (1) если оба ее операнда истинны (не равны 0). Результат || истина если хотя бы один из ее операндов истина. Гарантируется, что операнды вычисляются слева направо. Вычисление прекращается, как только определится, является ли выражение истинным или ложным. Это значит, что для выражения
выр1 && выр2
выр2 не будет вычисляться, если значение выр1 ложно (равно 0) а для выражения
выр1 && выр2
выр2 не будет вычисляться, если значение выр1 истинно (не равно 0) Следует отметить, что, в отличие от Паскаля, приоритет && и || ниже, чем у операций равенства и отношения и поэтому если нужно, к примеру, проверить, попала ли переменная в диапазон от 0 до 100, то такая запись корректна
if (i1 >= 0 && i1 <= 100)
и не требует дополнительных скобок.
Логическое отрицание! преобразует свой операнд в истину (1) если он равен 0 и в ложь (0) если он не равен нулю.
Выражение (!found) возвращает истину, пока found равен нулю.
Можно писать if(!found)
а можно
if(found == 0)
Каким образом писать - дело программиста, но в сложных выражениях лучше вместо! явно проверять на равенство.
Так же точно вместо
if (found!= 0)
можно просто написать
if (found)