Новосибирский Государственный Университет
Опубликован: 26.08.2005 | Доступ: свободный | Студентов: 17110 / 2712 | Оценка: 4.07 / 3.55 | Длительность: 13:11:00
ISBN: 978-5-9556-0057-4
Лекция 3:

Операции

Операция, уровень приоритета которой равен 13

Уровень приоритета операции равен 13, выполняются такие операции слева направо.

Операция условный оператор: ?

Тип операндов - арифметические; второй и третий операнды могут быть указателями, структурами, объединениями. Тип результата: int, long, unsigned, double, указатель, структура или объединение. Второй и третий операнды преобразуются к одному и тому же типу.

Условный оператор является единственным оператором, для которого необходимы три операнда ; используется он следующим образом:

a ? b : c

где a, b, c - выражения. Если a не равно 0, то результат выражения a ? b : c равен b ; иначе результат равен c. Из двух последних операндов вычисляется только один.

Использование:

ae?e1:e2

или

pe?e1:e2 (где pe - указатель)

Если истинно ae или pe, то выполняется e1 ; иначе выполняется e2. Значением этого выражения является значение выражения e1 или e2.

Пример:

abs=(i<=0)?-i:i;

Операция, уровень приоритета которой равен 14

Уровень приоритета операции равен 14, выполняются такие операции справа налево.

Операция простое присваивание "="

Тип операндов: арифметические, указатели, объединения или структуры. Тип результата: если оба операнда имеют арифметический тип, то значение правого операнда преобразуется к типу левого операнда.

Использование:

v=e

Присваивание значения e переменной v.

Пример:

x=y;
Операция сложное присваивание "="

Обозначим <знак> один из знаков : +, -, *, /, %, >>, <<, &, ^, |.

В результате выполнения операции присваивания

v=e

где v - переменная, а e - выражение, значение выражения становится новым значением переменной v.

Операция присваивания
v <знак>= e

приблизительно эквивалентна оператору присваивания

v = v<знак> e

Пример 1:

y+=2; /* Увеличение переменной y на 2 */
p+=n;
x-=3;
ptr-=2;
timesx*=x;
x/=2;
x%=10;
x>>=4;
x<<=1;
remitems&=mask;
control^=seton;
additems |=mask;

Типы операндов и результата сложного оператора присваивания можно определить на основании этой эквивалентности. Однако приведенный эквивалент для сложного оператора присваивания не совсем точен. В выражении

v <знак>= e

операнд v вычисляется только один раз, в то время как в выражении

v = v <знак> e

этот операнд вычисляется дважды. Это различие проявляется в побочных эффектах, связанных с вычислением операнда v, например, при изменении значения какой-либо переменной. Рассмотрим это на примерах:

a[i++]* = n;

При выполнении вычисление левого операнда дает побочный эффект - увеличение значения переменной i. Следовательно, это присваивание не эквивалентно присваиванию

a[i++] = a[i++]*n;.

Эквивалентом первой операции присваивания может служить последовательность операций

a[i]=a[i]*n;
i=i+1;

а эквивалентом второй - последовательность операций

a[i]=a[i+1]*n;
i=i+2;

или последовательность операций

a[i+1]=a[i]*n;
i=i+2;

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

Вадим Ратьков
Вадим Ратьков

Объясните, пожалуйста, чем отличаются два этих кода?

printf("смешанное деление: 7./4 это %2.2f \n", 7./4);

и

printf("смешанное деление: 7./4 это %f \n", 7./4);

%f  это, понятное дело, float. А что такое %2.2f ?

Вопрос возник при прочтении лекции 3 часть вторая курса Основы программирования на языке C.

http://www.intuit.ru/studies/courses/43/43/lecture/1281?page=2

Анна Алексанина
Анна Алексанина

Я хочу выполнить одну из программ, которые есть в лекции. Но для этого мне надо компилировать текст, а я не знаю, как это сделать. ОС Windows.

Максим Выдров
Максим Выдров
Россия
Александр Кудаков
Александр Кудаков
Россия