Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

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

Поиск

Специальные формы операций присваивания

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

A = A + 125

транслятор, прежде всего, генерирует код для вычисления значения выражения A + 125 и присвоения результата переменной A. При этом фрагмент кода, вычисляющий адрес переменной A дважды войдёт во множество команд процессора, реализующих это выражение.

В целях упрощения структуры подобных операторов в C++ применяются комбинированные (или сокращённые) формы операторов присваивания.

*= Операция присвоения произведения.

A *= B

Присвоение левому операнду произведение значений левого и правого операндов. Операция по своему результату эквивалентна простой форме операции присвоения, у которой правый операнд имеет вид произведения A * B, левый операнд имеет вид A. При этом A является модифицируемым l-выражением:

A = A * B

/= Операция присвоения частного от деления.

A /= B + 254

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

A / (B + 254)

левый операнд прелставляется выражением A. Очевидно, что при этом A должно быть модифицируемым l-выражением:

A = A / (B + 254)

%= Операция присвоения остатка от деления.

A %= B

Левый операнд должен быть модифицируемым l-выражением.

+= Операция присвоения суммы.

A += B

Левый операнд должен быть модифицируемым l-выражением.

-= Операция присвоения разности.

A -= B

Левый операнд должен быть модифицируемым l-выражением.

<<= Операция присвоения результата операции побитового сдвига влево на

количество бит, равное значению правого целочисленного операнда.

A <<= B

Левый операнд должен быть модифицируемым l-выражением.

>>= Операция присвоения результата операции побитового сдвига вправо

на количество бит, равное значению правого целочисленного операнда.

A <<= B

Левый операнд должен быть модифицируемым l-выражением.

&= Операция присвоения результата поразрядной конъюнкции битовых

представлений значений целочисленных операндов.

A &= B

Левый операнд должен быть модифицируемым l-выражением.

|= Операция присвоения результата поразрядной дизъюнкции битовых

представлений значений целочисленных операндов.

A |= B

Левый операнд должен быть модифицируемым l-выражением.

^= Операция присвоения результата поразрядной исключающей дизъюнкции

битовых представлений значений целочисленных операндов.

A ^= B

Условное выражение, или оператор выбора, предоставляет возможность более

компактной записи текстов, включающих инструкцию if-else. Например, вместо:

else is_equal = false;

можно употребить более компактную запись:

bool is_equa1 =!strcmp(strl, str2)? true: false;

Условный оператор if

Синтаксис:

а) сокращённая форма

if (<выр>) <оператор1>;

б) полная форма

if (<выр>) <оператор1>;

else <оператор2>;

Выражение <выр> может быть арифметическим, логическим или отношением. Если значение <выр> не равно нулю, то исполняется <оператор1>.

В полной форме если <выр> равно нулю, то исполняется <оператор2>.

Условная трёхместная операция (?:)

Синтаксис:

<выр1>? <выр2>: <выр3>;

Первым вычисляется значение <выр1>.

Если оно не равно нулю (истинно), то вычисляется значение <выр2>. Значение <выр3> не вычисляется.

Если значение <выр1> равно нулю (ложно), то вычисляется значение <выр3>. Вычисление значения <выр2> не производится.

Пример:

Sign = x<0? -1: 1;

Ранги операций и порядок вычисления выражений.

Ниже приведены операции в порядке убывания приоритета. Операции, приведённые на одной строчке, имеют одинаковый приоритет. Операции, помеченные как R->L, имеют правую ассоциативность (то есть при сочетании равноприоритетных операций без скобок они вычисляются справа налево; при этом порядок вычисления аргументов большинства операций не специфицирован и зависит от реализаций):

Постфиксные операции [] (). -> ++ --

Унарные операции (R->L) ++ -- & * + - ~! sizeof (type)

Мультипликативные * / %

Аддитивные + -

Сдвиговые << >>

Операции сравнение < > <= >=

Операции проверки равенство ==!=

Побитовые & ^ |

Логические && ||

Условная операция (R->L)?:

Операции присваивания (R->L) = *= /= %= += -= <<= >>= &= ^= |=

Последовательное вычисление,

Условные операторы в Си.

Условный оператор if

Синтаксис:

а) сокращённая форма

if (<выр>) <оператор1>;

б) полная форма

if (<выр>) <оператор1>;

else <оператор2>;

Выражение <выр> может быть арифметическим, логическим или отношением. Если значение <выр> не равно нулю, то исполняется <оператор1>.

В полной форме если <выр> равно нулю, то исполняется <оператор2>.

Условная трёхместная операция (?:)

Синтаксис:

<выр1>? <выр2>: <выр3>;

Первым вычисляется значение <выр1>.

Если оно не равно нулю (истинно), то вычисляется значение <выр2>. Значение <выр3> не вычисляется.

Если значение <выр1> равно нулю (ложно), то вычисляется значение <выр3>. Вычисление значения <выр2> не производится.

Пример:

Sign = x<0? -1: 1;

35. Оператор-переключатель.

Переключатели

Синтаксис:

switch(<выр>)

{

case <константа_1>: <операторы_1>;

case <константа_2>: <операторы_2>;

case <константа_L>: <операторы_L>;

default: <операторы>;

}

При входе в переключатель вычисляется значение <выр>. Если оно совпадает с одной из констант, то выполняются операторы, указанные в соответствующей ветви case. Например, если <выр>==<константа_L>, то выполняются <операторы_L>.

Если значение <выр> не совпадает ни с одной из констант, то выполняются операторы, указанные после default.

Если среди операторов исполняемой ветви нет какого-либо оператора перехода (break, goto, return, exit()), то исполняются операторы следующей ветви.

Если среди операторов исполняемой ветви встретился оператор break, то управление передаётся оператору, следующему за переключателем. Если встретился оператор goto, то управление передаётся на указанную метку.

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

Пример:

switch (operand) {

case MULTIPLY: x *= y; break;

case DIVIDE: x /= y; break;

case ADD: x += y; break;

case SUBTRACT: x -= y; break;

case INCREMENT2: x++;

case INCREMENT1: x++; break;

case EXPONENT:

case ROOT:

case MOD: printf("Not done\n"); break;

default: printf("Bug!\n");

exit(1);

}

Если operand == MULTIPLY, то будет выполнено x *= y; и обработка переключателя (и исполнение программы) завершится.

Если operand == INCREMENT2, то будет выполнено x++; x++; и обработка переключателя завершится.

Если operand примет значение EXPONENT, ROOT или MOD, то будет исполнено printf("Not done\n"); break;

36. Операторы цикла в Си.

Параметрический цикл For

Синтаксис:

for ([<выр1>]; [<выр2>]; [<выр3>]) <оператор>;

<оператор> повторно исполняется до тех пор, пока <выр2> не примет значения 0 («ложь»).

ДО ПЕРВОЙ итерации цикла вычисляется значение <выр1>. Обычно это используют для инициализации счётчика цикла. Затем вычисляется значение <выр2>.

ПОСЛЕ КАЖДОЙ итерации вычисляется значение <выр3>. Обычно это используют для увеличения значения счётчика цикла. Затем вычисляется значение <выр2>.

<выр1> и <выр3> могут состоять из нескольких выражений, разделённых запятыми.

Все параметры заголовка цикла необязательные, но оба разделителя ‘;’ должны иметь место. Т.е., допустимы формы

For(<выр1>;;) <оператор>;

For(;<выр2>;) <оператор>;

For(;;<выр3>) <оператор>;

For(<выр1>;;<выр3>) <оператор>;

и т.д.

Если отсутствует <выр2>, то его значение считается равным 1 («истина»).

Цикл с предусловием while

Синтаксис:

while (<выр>) <оператор>;

<оператор> повторно исполняется пока значение <выр> остаётся не равным нулю. Значение <выр> вычисляется ПЕРЕД каждой итерацией.

Цикл с постусловием do... while

Синтаксис:

do <оператор> while (<выр>);

<оператор> повторно исполняется пока значение <выр> остаётся не равным нулю. Значение <выр> вычисляется ПОСЛЕ каждой итерациеи.

 

 



Поделиться:


Последнее изменение этой страницы: 2016-09-13; просмотров: 329; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.147.57.239 (0.007 с.)