Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Язык С начало.doc
Скачиваний:
11
Добавлен:
31.07.2019
Размер:
132.61 Кб
Скачать

Побитовые операции.

Используется стандартное соглашение (0-ложь, 1-истина).

Побитовая операция с одним битом выполняется по обычным логическим правилам. Пусть, например переменные X и Y однобитовые (т.е. могут принимать значение 0 или 1). Тогда результат побитовых операций определяется по таблице:

X

0 0 1 1

Y

0 1 0 1

X&Y

X|Y

X^Y

0 0 0 1

0 1 1 1

0 1 1 0

Если X и Y обычные переменные, то переводим их в двоичную систему, а дальше над каждым разрядом(битом) выполняем побитовые операции.

Пример. Чему равно 18 | 10?

18 в двоичной системе 10010

10 в двоичной системе 01010

Выполняем побитовое ИЛИ.

1 0 0 1 0

0 1 0 1 0

-----------

1 1 0 1 0

11010 – это 26.

Таким образом, 18 | 10 = 26.

Упр. Вычислить 211 | 5, 105^3, 10&2.

В качестве примера использования побитовых операций приведем следующую функцию:

char f(char x){

return(x & 223);

}

Упр. Что делает данная функция? Чему равно f(‘A’), f(‘a’), f(‘b’)?

Упр. Написать функцию, которая маленькие буквы не меняет, а большие преобразует в маленькие.

Операции ++ и --.

i++ - то же, что i=i+1.

++i отличается от i++ только порядком выполнения действий.

Пример.

Последовательность команд

i=5;

x=++i;

эквивалентна следующей последовательности

i=5;

i=i+1;

x=i;

В результате получим x=6, y=6.

Последовательность команд

i=5;

x=i++;

эквивалентна следующей последовательности

i=5;

x=i;

i=i+1;

В результате получим x=5, y=6.

Упр.

Что получим, выполнив последовательность команд

i = 5;

i = i++ + ++ i ?

Операции сдвига.

Пример.

i=6; i<<3;

Что получим?

Чтобы определить результат операции, мы сначала переводим 6 в двоичную систему, получаем 1 1 0, а потом сдвигаем данное число на з двоичных разряда влево, получаем 1 1 0 0 0 0, т.е. 48. Очевидно, что сдвиг влево на один разряд эквивалентен умножению числа на два.

Таким образом, для целой переменной x сдвиг x<<n – это то же самое, что

x * 2n. Аналогично, x >> n – это x / 2n. При этом надо заметить, что сдвиг выполняется намного быстрее умножения.

Условная операция.

Синтаксис.

<Выражение 1> ? <Выражение 2> : <Выражение 3>;

Если выражение 1 истинно (не равно 0), то результатом операции является выражение 2, иначе выражение 3.

Пример.

y=(x<0) ? (-x) : (x);

На русский язык переводится как y=| x |;

Операции с присваиванием.

a+=5; то же самое, что a=a+5;

Выражения.

Как уже было сказано, выражения состоят из операндов и знаков операций и используются для вычисления значений определенного типа. Оперции выполняются в соответствии с приоритетами (см. таблицу). Для изменения порядка выполнения используются круглые скобки.

Если в одном выражении есть несколько операций одинакового приоритета, то унарные операции, условная операция и операции присваивания выполняются справа налево, а остальные слева направо.

Например, x=y=z то же самое, что x=(y=z), а выражение x+y+z означает (x+y)+z.

В языке С присваивание само является выражением, т.е. имеет значение.

Пример 1. Достаточно часто встречающаяся ошибка.

int c=2;

if(c=5)

printf(“c=5”);

Пояснить.

Пример 2.

b = 2+(a=5);

Результат a=5;b=7;

Пример 3.

a=b=c=10;

В результате всем трем переменным будет присвоено 10.

Логические выражения обычно принимают значение 0 (ложь) и 1(истина).

Пример использования данного факта

y=(x*x+1)*(x<0) + x*(x>=0 && x<1) + 5*(x>=1);

Пояснить.

Еще пример.

while(1) {

тело цикла

}

Бесконечный цикл.