Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие_2_изд_испр.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
2.27 Mб
Скачать

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

Порядок: 

Оператор

Уровень

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

&&

11

И

||

12

Или

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

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

Порядок: 

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

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

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

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

Пример.

a<b ? 2*x : x/2

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

Порядок: 

Правило записи: 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 на 4 байта.

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

11.12. Уровень 15 (оператор ',' - запятая)

Порядок:

Формат: e1[,e2]... , где e1, e2 - выражения.

Результат имеет тип и значение самого правого выражения списка. Как правило, используется с выражениями, содержащими оператор присваивания. Весьма удобен при достаточно сложных инструкциях цикла.

Пример.

for(i=0, j=N-1; i<j; i++, j--){ // Одновременное изменение в одном цикле переменных i

// и j в разных направлениях

11.13. Некоторые замечания

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

2. В языке C не задан порядок вычисления операндов. При побочных эф-фектах результат машинно зависим. Побочным эффектом называют изменение значений аргументов функций. В выражении x=f(x, y)+g(&x, &y); при перестановке слагаемых изменится результат.

3. Также не фиксирован порядок вычисления аргументов функций.

Пример.

printf("%d%d\n", ++n, pow(2,n)); // Результат неоднозначен

4. Не применяйте неоднозначных выражений. Чему равно, например, выражение a[i++] = i++;? Так не писать не следует!!!