Порядок выполнения операций: приоритеты операций и ассоциативность
Когда над одним и тем же операндом может быть выполнено несколько операций, C++ руководствуется правилами старшинства или приоритетов, чтобы определить, какая операция должна быть выполнена первой. Арифметические операции выполняются в соответствии с алгебраическими правилами, согласно которым умножение, деление и нахождение остатка от деления выполняются раньше операций сложения и вычитания. Поэтому выражение 3 + 4*5 следует читать как 3+ (4 * 5), но не (3 + 4) * 5. Таким образом, результатом этого выражения будет 23, а не 35. Конечно, чтобы обозначить свои приоритеты, вы можете заключать операнды и операции в скобки.
Значит, запись на языке С++ следующих выражений:
,
Однако знания только лишь приоритетов операций не всегда бывает достаточно. Взгляните на следующий оператор:
float logs = 120 /4*5; // каким будет результат: 150 или 6?
И в этом случае над операндом 4 могут быть выполнены две операции. Однако операции /и * имеют одинаковый уровень приоритета, поэтому программа нуждается в уточняющих правилах, чтобы определить, нужно сначала 120 разделить на 4 либо 4 умножить на 5. Поскольку результатом первого варианта является 150, а второго — 6, выбор здесь очень важен. В том случае, когда две операции имеют одинаковый уровень приоритета, C++ анализирует их ассоциативность: слева направо или справа налево.
Различные результаты, получаемые после деления
Давайте продолжим рассмотрение особенностей операции деления (/). Поведение этой операции зависит от типа операндов. Если оба операнда являются целочисленными, то C++ выполнит целочисленное деление. Это означает, что любая дробная часть результата будет отброшена, приводя результат к целому числу. Если один или оба операнда являются значениями с плавающей точкой, то дробная часть остается, поэтому результатом будет число с плавающей точкой. В действительности, при комбинировании смешанных типов C++ преобразует их к одному типу.
Язык C++ довольно либерален, разрешая присваивание числового значения одного типа переменной другого типа. Всякий раз, когда вы это делаете, значение преобразуется к типу переменной, которая его получает.
Примечание: Результат деления целого числа на целое имеет целый тип, причем дробная часть результата просто отбрасывается. Например: 17/3=5, 99/10=9, (9/4)*4=8.
// изменение типа при инициализации
#include
int main ()
{
using namespace std;
float a = 3; // int преобразован в float
int b = 3.9832; // float преобразован в int
int c = 7.2E12; .// результат не определен в C++
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl;
return 0;
}
Do'stlaringiz bilan baham: |