
- •Последовательность решения задач на эвм:
- •Состав языка
- •Комментарии
- •Переменные, операции, выражения
- •Базовые алгоритмические конструкции
- •Оператор множественного выбора switch
- •Тернарная условная операция
- •Циклические алгоритмы
- •Операции
- •Операция инкремента и декремента
- •Операции отрицания
- •Операции умножения и деления
- •Операции сдвига
- •Логические операции (&&, ||)
- •Операция присваивания
- •Выражения
- •Работа с памятью Память и указатели
- •Операции адресации и разадресации (&, *)
- •Адресная арифметика
Операции сдвига
Применяются только к целочисленным операндам. Сдвигают биты в двоичном представлении операнда 1 на количество разрядов, указанных в операнде 2. При сдвиге влево освободившиеся разряды занимаются нулями. При сдвиге вправо в беззнаковых операндах освободившиеся биты занимаются нулями, а в знаковых – заполняются знаковым битом.
short int x = 9, y; //x = 00000000 00001001
y = x << 3; //y = 00000000 010010002 = 7210
y = x >> 2; //y = 00000000 000000102 = 210
Сдвиг влево на 3 – умножение на 23 = 8, вправо – целочисленное деление на 22 = 4.
Очень эффективные по времени выполнения, поэтому при умножении на 2k очень удобно использовать операции сдвига.
01.10.2012
Операции сравнения (<, <=, >, >=, !=, ==)
Выполняют сравнение первого операнда со вторым. Операнды могут быть арифметических типов/указателями. Результатом является значение “true”/ “false”. Любое ненулевое значение – “true”, 0 = “false”.
cout << (3 == 2) // 0
cout << (3 == 3) // 1
Побитовые логические операции (&, |, ^)
Применяются только к целочисленным операндам и работают с их двоичным представлением. При выполнении этих операций первый бит первого операнда с сопоставляется первому биту второго операнда.
Таблица истинности
x |
y |
& (и) |
| (или) |
^ (xor) |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
1 |
0 |
1 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
Типичный случай использования битовых операций – это определение/установка значений отдельных битов или групп битов.
unsigned x = 0;
y = x | (1 << 3);
0000 0000
| 0000 1000
0000 1000
unsigned x;
y = x | (1 << 3);
1001 0100
| 0000 1000
1001 1100
Операция | – битовое сложение. Операция & – битовое умножение.
1) unsigned x;
y = x & (1 << 3);
1001 0100
& 0000 1000
0000 0000
2) y = (x & (1 << 3)) >> 3 // y = 0 или y = 1
3) 0010 1010 << 4
1010 0000 >> 7
0000 0001
Логические операции (&&, ||)
Операнды могут быть либо арифметическими типами, либо указателями, причём в любых сочетаниях. Таблицы истинности такие же, как и для побитовых операций.
unsigned x = 3, y = 5, z = 0;
cout << (x && y); //1
cout << (x || y); //1
cout << (x && z); //0
cout << (x || z); //1
cout << !(x || y); //0
Логические операции вычисляются слева направо, т.е. сначала первый операнд, а потом второй. Если значения первого операнда достаточно, чтобы определить результат, то второй операнд не вычисляется.
unsigned x = 3, y = 5, z = 0;
z = (x && y ++); //z = 1;
out << z << “ ” << y; //1 6
z = (x || y ++); //z = 1;
out << z << “ ” << y; //1 5
Т.к. в примере с “||”: оп 1 ≠ 0 => ответ – “не ноль”.
Операция присваивания
Lvalue (от Left value) – значение, которое может находится в левой части оператора присваивания.
Формат операции: Lvalue op expression (не всегда является именем переменной)
В простейшем случае сначала вычисляется выражение в правой части, затем его результат записывается в место памяти, соответствующее Lvalue. В более сложных случаях при вычислении expression может использоваться значение Lvalue. Общий формат этих более сложных случаев следущий:
Lvalue op= expression Lvalue = Lvalue op expression
int a = 5;
a = a + 10 a += 10 – предпочтительнее и эффективнее, т.к. адрес вычисляется только один раз
Как и все операции в С++, операция присваивания имеет результат. Результатом является значение Lvalue после выполнения операции. Это позволяет встраивать операцию присваивания внутрь других выражений.
1) int a = 5;
cout << ((a += 3) + 2); //17
2) a = b = c = 1;