Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
933 Кб
Скачать
☆

11.8. Поразрядные операторы

Порядок: 

Операндами для них являются целые (лучше беззнаковые – unsigned) значения. Операторы обрабатывают стоящие на одинаковых позициях двоичные разряды внутреннего представления операндов. Отсюда и название: поразрядные или битовые. Результат действия приведен в параграфе 4.4.

Оператор

Уровень

Наименование

&

8

И

^

9

Исключающее или

|

10

Или

Пример.

unsigned a, b, c, d, e;

..................................

a=0x7ac3; // 0111 1010 1100 0011 – двоичное представление

b=0x5bf9; // 0101 1011 1111 1001

c=a&b; // 0101 1010 1100 0001 -> 0x5ac1

d=a^b; // 0010 0001 0011 1010 -> 0x213a

e=a|b; // 0111 1011 1111 1011 -> 0x7bfb

11.9. Логические операторы

Порядок: 

Оператор

Уровень

Наименование

&&

11

И

||

12

Или

Если первый операнд для оператора && равен 0, то второй не вычисляется. Если первый операнд для оператора || равен 1, то второй не вычисляется.

Логические операторы языка Basic: Not (отрицание), And (И) и Or (Или). Также имеются операторы AndAlso, OrElse , Xor, Eqv и Imp. Уровень их соответствует уровню логических операторов языка С. Приоритет между ними следующий (по убыванию слева направо): Not { And | AndAlso} {Or | OrElse} Xor Eqv Imp.

Результат выполнения всех операторов и различие между операторами And и AndAlso, Or и OrElse показано в параграфе 4.4. Следует обратить внимание на существенную разницу в уровне приоритета операторов отрицания ! (язык С) и Not (язык Basic).

11.10. Уровень 13 (условное выражение)

Порядок: 

Правило записи: e1?e2:e3, где e1, e2, e3 - выражения.

Порядок выполнения:

- вычислить e1;

- если e1 != 0, то результат = e2, иначе результат = e3.

Пример.

a<b ? 2*x : x/2

В языке Basic есть аналогичный оператор, работающий по тому же правилу.

Правило записи: If(e1,e2,e3), где e1, e2, e3 - выражения. Если e1 = true, то результат = e2, иначе результат = e3.

Пример. If(a<b, 2*x, x/2)

11.11. Уровень 14 (операторы присваивания)

Порядок: 

Правило записи: …[e0[<op>]=] e1[<op>]= e2

Здесь e1 - переменная (простая или с индексами), которой задается значение e2. e2 - выражение. e2 преобразуется к типу e1 (если возможно). Запись <op> является необязательной и означает выполнение указанной операции над "старым" значением e1 (в качестве второго операнда выступает e2), а затем присваивание полученного "нового" значения переменной e1. Допустимыми операциями являются: + - сложение, - – вычитание, * – умножение, / – деление, % – остаток, >>, << – сдвиг вправо или влево, &, ^, | – поразрядные операторы.

Пример.

a*=5; // Это эквивалентно a=a*5;

Замечание. Выражение x*=y+1 означает x=x*(y+1), а не x=x*y+1, поскольку уровень оператора *= ниже уровня оператора +.

В комбинированных операциях значение e1 вычисляется 1 раз, т.е. выражение a[i++]*=n; эквивалентно a[i]=a[i]*n; i=i+1; (постфиксный оператор ++), а выражение a[++i]*=n; - выражению i=i+1; a[i]=a[i]*n; (префиксный оператор ++).

Оператор = может входить в состав выражения.

Пример.

while((c=getchar())!=EOF){// Это означает посимвольное чтение

//текстового файла до его окончания

EOF(End Of File) – символическая константа, означающая конец файла и определенная в файле stdio.h.

Переменная e1 может быть указателем.

Пример.

int *x;

.......

x+=2; // Изменяет значение x на 8 байтов

Замечание. Не увлекайтесь сложными выражениями, пишите проще!

Допустимо присваивание выражения e2 последовательнонескольким переменным (многократное присваивание).

Пример.

float x, y, z;

short k;

………………….

x=3.5; y=-2.7;

z=k=x+=x+y; // x=4.3 k=4 z=4

z=4, поскольку присваивание выполняется по очереди справа налево. Порядок выполнения:

x+y //=0.8

x+= //=4.3

k= //=4 k-целое, дробная часть отбрасывается

z= //=4

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