WWW.DISSERS.RU

БЕСПЛАТНАЯ ЭЛЕКТРОННАЯ БИБЛИОТЕКА

   Добро пожаловать!


Pages:     | 1 || 3 | 4 |   ...   | 17 |

a+=2 означает a=a+bottom_count [2*i+3*j+k]* =2 означает bottom_count [2*i+3*j+k] = bottom_count [2*i+3*j+k]*s/=a означает s=s/a Результатом операции присваивания является ее левый операнд;

следовательно, ее результат – адресное выражение и поэтому возможна запись (a=b)+=c;

Это эквивалентно следующим двум операторам:

a=b; a=a+c;

3.2. Арифметические операции Бинарными арифметическими операциями являются + – * / %.

(Существуют также унарные + и – ).

При делении целых дробная часть отбрасывается.

Так, 10/3 дает 3, в то время как 10/3.0 дает 3.33333...

Операция a % b применяется только к целым операндам и дает остаток от деления a на b, так 10%3 дает 1, 2%3 дает 2, 12%2 дает 0.

3.3. Операции отношения Операциями отношения являются => > <= <.

Все они имеют одинаковое старшинство. Непосредственно за ними по уровню старшинства следуют операции равенства и неравенства:

= = (равно), != (не равно) с одинаковым старшинством.

Операции отношения младше арифметических операций, так что выражения типа i < lim+3 понимаются как i < (lim+3).

Операция сравнения определяет некоторое выражение. Значение этого выражения равно целой 1, если условие, выраженное сравнением, выполняется и равно 0, если нет.

3.4. Логические операции К логическим операциям относятся:

унарная операция логическое НЕ, ! (отрицание);

бинарная операция логическое И, && (конъюнкция);

бинарная операция логическое ИЛИ, || (дизъюнкция).

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

Операнды логических выражений вычисляются слева направо.

Результатом логической операции является 0 или 1 типа int.

Операция !операнд дает 0, если операнд ненулевой и 1 если операнд равен нулю.

Операция && (И-логическое, логическое умножение) дает значение 1, если оба операнда имеют ненулевое значение. Если один из операндов равен 0, то результат также равен 0. Если значение первого операнда равно 0, то второй операнд не вычисляется.

Операция || (ИЛИ-логическое, логическое сложение) вырабатывает значение 0, если оба операнда равны 0. Если какой-нибудь из операндов имеет ненулевое значение, то результат операции равен 1. Если первый операнд имеет ненулевое значение, то второй операнд не вычисляется.

По приоритету эти операции распределены так: !, &&, ||.

3.5. Побитовые операции К побитовым, или поразрядным операциям относятся:

операция поразрядного И &;

операция поразрядного ИЛИ |;

операция поразрядного исключающего ИЛИ ^;

унарная операция поразрядного отрицания (дополнение) ~.

Кроме того, рассматриваются операции сдвигов <<, >>.

Операнды поразрядных операций могут быть любого целого типа.

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

Операция | сравнивает каждый бит первого операнда с соответствующим битом второго операнда; если любой из них или оба равны 1, то соответствующий бит результата устанавливается в 1, в противном случае в 0.

Операция ^. Если один из сравниваемых битов равен 0, а другой равен 1, то соответствующий бит результата устанавливается в 1, в противном случае, т.е. когда оба бита равны 1 или оба равны 0, бит результата устанавливается в 0.

Операция ~ меняет в битовом представлении операнда 0 на 1, а – на 0.

Побитовая операция & часто используется для маскирования некоторого множества битов, например:

С=N&передает в С семь младших битов N, полагая остальные равными 0. (С первого нуля в С++ начинаются восьмеричные константы; с 0Х – шестнадцатеричные константы).

Пусть N =642. Приведем побитовое представление N восьмеричной константы 0177 и результата С:

N 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0177 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 C 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 Операция | используется для включения битов:

С= N|MASK устанавливает в 1 те биты в N, которые равны 1 в MASK.

Еще примеры:

int a=0x45ff, b=0x00ff;

int c;

c= a ^ b; // c: 0xc= a | b; // c: 0x45ff c= a & b; // c: 0x00ff c= ~ a; // c: -0x3ac= ~ b; // c: -0x7fЭтот фрагмент программы можно проиллюстрировать так:

a 0 1 0 0 0 1 0 1 1 1 1 1 1 1 1 b 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 c=a^b 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 c=a|b 0 1 0 0 0 1 0 1 1 1 1 1 1 1 1 c=a&b 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 c=~b 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 С помощью операции & можно определить остаток от деления операнда типа unsigned int на 2, 4, 8, 16 и т.д. Для этого достаточно применить операцию & к делимому с масками 0x01, 0x03, 0x07, 0x0f, 0x1f и т.д. Например:

7&0x03 дает 3.

Другими словами, выделяются младшие биты числа, а остальные устанавливаются в 0.

3.6. Сдвиги Операции сдвига << >>осуществляют, соответственно, сдвиг влево и вправо своего левого операнда на число битовых позиций, заданных правым операндом. Таким образом, Х << 2 сдвигает Х влево на позиции, заполняя освобождающиеся биты нулями, что эквивалентно умножению на 4. Сдвиг вправо величины без знака сопровождается дополнением старших битов нулями. Сдвиг вправо такой величины на n битов эквивалентен целочисленному делению левого операнда на 2 в степени n.

Так, 5 << 3 дает 40;

7 >> 2 дает 1.

Отметим, что правый операнд должен быть константным выражением, т.е. выражением, включающим в себя только константы. Если правый операнд отрицателен или он больше, или равен числу битов левого операнда, то результат сдвига не определен. Типом результата операции сдвига является тип левого операнда.



3.7. Операции автоувеличения и автоуменьшения ++ и – – Эти операции являются унарными операциями присваивания. Они соответственно увеличивают или уменьшают значение операнда на 1.

Операнд должен быть целого или плавающего типа (или типа указатель) и быть не константным адресным выражением (т.е. без слова const в описании). Тип результата соответствует типу операнда.

Префиксная форма операций:

++ операнд – – операнд Постфиксная форма:

операнд ++ операнд – –.

Если знак операции стоит перед операндом, результатом операции является увеличенное или уменьшенное значение операнда. При этом результат является адресным выражением (l-value).

Если знак операции стоит после операнда, значением выражения будет значение операнда. После использования этого результата значение операнда увеличивается или уменьшается. Результат постфиксной формы этих операций не является l-value.

Примеры:

int i=0, j=0, k, l;

k = ++i; // Здесь k=1 и i стало рано 1;

l= j ++; // l=0, а j стало равно 1;

– – k; // k=0;

+ + j; // j стало равно 2.

Иначе говоря, результат выполнения k = ++i; тот же, что и в последовательности операторов i = i+1; k = i;

А результат k = i++; такой же, как и в k = i; i = i+1;

3.8. Тернарная или условная операция Тернарная операция, т.е. операция с тремя операндами, имеет форму операнд1 операнд2 : операндПервый операнд может быть целого или плавающего типа (а также указателем, ссылкой или элементом перечисления). Для этой операции важно, является значение первого операнда нулем или нет. Если операнд1 не равен 0, то вычисляется операнд2 и его значение является результатом операции. Если операнд1 равен 0, то вычисляется операнд3, и его значение является результатом операции. Заметим, что вычисляется либо операнд2, либо операнд3, но не оба.

Пример:

max= a<=b b:a;

Здесь переменной max присваивается максимальное значение из переменных а и b.

Если в условной операции операнд2 и операнд3 являются адресными выражениями, то тернарная операция может стоять слева от знака присваивания:

a

Здесь значение выражения c*x+d присваивается меньшей из двух переменных а и b.

3.9. Операция следования Символом операции следования является, (запятая). Выражения, разделенные этим символом, выполняются слева направо строго в том порядке, в котором они перечислены.

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

Примеры:

int a=3, b=8, c; // здесь запятая – разделитель, а не операция;

c=a++, a+b; // здесь а станет равно 4, а с 12;

(b--,c)*=3; // здесь b станет равно 7, а с 36.

Операция следования часто используется в операторе for. В различные части этого оператора можно включить несколько выражений, например, для параллельного изменения двух индексов. Это иллюстрируется функцией REVERSE(S), которая располагает строку S в обратном порядке на том же месте.

void REVERSE ( char S[ ] ){ int C, I, J;

for ( I = 0, J = strlen (S) – 1; I < J; I++, J – –){ C = S[I]; S[I] = S[J]; S[J] = C; } } В этом примере strlen(S) – функция, вычисляющая число символов в строке S (без символа ‘\0’).

Запятые, которые разделяют аргументы функций, переменные в описаниях и т.д., не имеют отношения к операции запятая и не обеспечивают вычислений слева направо.

3.10. Приоритеты операций и порядок вычисления Сведения обо всех операциях С++ сведены в следующую табл. 4:

Таблица Приоритет операций и порядок их выполнения При- Операция Примечание Порядок оритет выполнения 1 ::->. Разрешение контекста, извлечение слева-направо [ ] индексирование массива слева-направо ( ) вызов функции слева-направо ( ) преобразование типа слева-направо 2 ++ -– ~ ! справа-налево –+ унарный –, унарный + справа-налево & получение адреса справа-налево * разрешение указателя справа-налево new, delete работа с динамической памятью справа-налево sizeof определение размера справа-налево 3 * умножение слева-направо / деление слева-направо % остаток слева-направо 4 извлечение слева-направо *.* 5 + бинарное сложение слева-направо – бинарное вычитание слева-направо 6 << >> сдвиги слева-направо 7 < <=> => сравнение слева-направо 8 = = != равно не равно слева-направо 9 & побитовое И слева-направо 10 ^ XOR (исключающее ИЛИ) слева-направо 11 | побитовое ИЛИ слева-направо 12 && И-логическое слева-направо 13 || ИЛИ-логическое слева-направо 14 : тернарная операция справа-налево 15 = *= /= операция присвоения справа-налево %= += и т.д.

16, следование слева-направо Первый приоритет является наивысшим. Большинство операций выполняется слева направо. Например, выражение а + b + c интерпретируется как (а + b) + с. Исключение составляют унарные операции, операции присваивания и операция :, которые выполняются справа налево: а = b = с выполняется как a = (b = c).

Если нужно изменить порядок действий, то применяются круглые скобки.

Выражение 7.a + b/-с интерпретируется как (7. a) + (b/(-c)).

Можно изменить этот порядок:

7. (a+b)/(-c).

Отметим, что выражения, в которые входит одна из бинарных операций + & ^ |, могут перегруппировываться компилятором, даже если они заключены в круглые скобки. Для обеспечения нужного порядка вычисления можно использовать явные промежуточные вычисления. В С++ не фиксируется порядок вычисления операндов в выражении. Например, в c=sin(ax+b)+fabs(x);





может сначала быть вычислен первый операнд, а затем второй, а может быть, и наоборот. В простых случаях это не имеет значения. Но если необходим определенный порядок, нужно вводить промежуточные переменные.

4. Операторы В С++ точка с запятой является признаком конца оператора.

4.1. Пустой оператор Пустой оператор состоит из ;. Он используется там, где по правилам языка должен находиться какой-либо оператор, а по логике программы там ничего выполнять не надо.

4.2. Оператор-выражение Любое выражение, за которым следует ;, является оператором.

Такой оператор называется оператор-выражение.

Примеры:

i ++;

a = b+c;

c + = (a

x+y; //Здесь результат не используется //и будет выдано предупреждение.

4.3. Составной оператор Составной оператор иначе называют блоком. Он представляет фрагмент текста программы, заключенный в фигурные скобки и, как правило, объединяющий несколько операторов. Составной оператор должен использоваться там, где синтаксис языка требует наличие лишь одного оператора, а логика программы – сразу нескольких:

{i=5; c=sin(ix); c++;} // Это блок.

4.4. Объявления В С++ объявления являются операторами языка и могут стоять там, где возможен любой другой оператор С++:

s = 0.3; d/=s; int k = 5;

d = s+2*k;

double f=s+d; f=k;

4.5. Условный оператор Имеется две формы условного оператора:

1) if (выражение) оператор2) if (выражение) оператор1 else операторОператор1 выполняется в случае, если выражение принимает ненулевое значение. Если выражение принимает значение 0 (или указатель NULL), то выполняется оператор2.

Примеры:

if (a > b) c = a – b; else c = b – a;

if (i < j) i++; else {j = i – 3; i ++;} При использовании вложенных операторов if текущий else всегда относится к самому последнему if, с которым еще не сопоставлен ни один else.

void main ( ){ int a = 2, b = 7, c = 3;

if (a > b) { if (b

cout<<“c=“<

} Здесь результатом будет вывод строки c=2.

Если опустить фигурные скобки в операторе if, то программа примет вид void main ( ){ int a=2, b=7, c=3;

if (a > b) if (b < c) c=b;

else c = a;

cout<<“c=“<

} Здесь else относится ко второму if.

В результате выведется строка c=3.

4.6. Оператор выбора switch Этот оператор позволяет передать управление одному из нескольких помеченных метками операторов в зависимости от значения целочисленного выражения. Метки оператора switch имеют специальный вид:

case целая_константа:

Вид оператора switch:

switch (целое_выражение ){ [объявления] [case константное_целое_выражение1:]...

[case константное_целое_выражение2: ] [операторы]...

[case константное_целое_выражение m:]...

[case константное_целое_выражение n:] [операторы] [default:] [операторы] } Здесь [ ] означают необязательную часть оператора, а... говорит о том, что указанная конструкция может применяться сколько угодно раз.

Блок после switch( ) называют телом оператора switch.

Схема выполнения оператора:

Сначала вычисляется выражение в круглых скобках (назовем его селектором).

Затем вычисленное значение селектора последовательно сравнивается с константным выражением, следующим за case.

Если селектор равен какому-либо константному выражению, стоящему за case, то управление передается оператору, помеченному соответствующим оператором case.

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

Если default отсутствует, то управление передается следующему за switch оператору.

Отметим, что после передачи управления по какой-либо одной из меток дальнейшие операторы выполняются подряд. Поэтому, если необходимо выполнить только часть из них, нужно позаботиться о выходе из switch. Это обычно делается с помощью оператора break, который осуществляет немедленный выход из тела оператора switch.

Пример 1:

int i, d;

cout<<“Задайте целое значение i\n”;

cin>>i;

switch ( i ){ case 1: case2: case3: cout<<“ i=“<< i <<“\n”;

case 4: cout<<“ i=”<< i <<“ i^2= “<

d=3i – 4; cout<<“ d=“ << d <<“.\n”;

break;

case 5: cout<<“i=5.\n”; break;

default: cout<<“ Значение i меньше 1 или больше 5.\n”;

} Если ввести число 2, то будет напечатано i= i=2 i^2= d=2.

Если i равно 4, то будет выведено i=4 i^2=d=8.

При i=5 будет выведено i=5.

При всех остальных значениях i будет напечатано Значение i меньше 1 или больше 5.

Пример 2:

char sign;

int x, y, z;

cout<<”Задайте знак операции + – * / \n”;

cin>>sign;

cout<<”Задайте x и y \n”;

cin>>x>>y;

switch (sign){ case ‘+’: z= x + y; break;

case ‘–’: z= x – y; break;

case ‘*’: z= x * y; break;

case ‘/’: if ( y = = 0 ){cout<<”Делить на нуль нельзя!\n”; exit(1);} else z = x / y; break;

default: cout<<”Неизвестная операция!\n”; exit(1);

} Здесь exit(1) – вызов функции, который приводит к немедленному прекращению выполнения программы.

4.7. Оператор цикла while Оператор цикла с предусловием имеет вид while (выражение) оператор Оператор называют телом цикла.

Pages:     | 1 || 3 | 4 |   ...   | 17 |










© 2011 www.dissers.ru - «Бесплатная электронная библиотека»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.