Фраза "Структурная переменная описывается с помощью переменной структурного типа" на мой Взгляд является тафтология. Из нее сложно понять суть утверждения. Хотелось бы полке понятного описания. |
Операции
Операция, уровень приоритета которой равен 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;
в зависимости от того, какая часть операции присваивания вычисляется раньше - левая или правая. Порядок таких вычислений не определен.