Автор: Пользователь скрыл имя, 17 Января 2011 в 18:57, курс лекций
6 тем.
#include <iostream>
using namespace std;
int main()
{
int x=3, y=4;
cout <<++x <<"\t"<< --y<<endl;
cout <<x++ <<"\t"<< y--<<endl;
cout <<x <<"\t"<< y<<endl;
return 0;
}
Результат
работы программы:
4 3
4 3
5 2
Операции отрицания (-, !)
Арифметическое отрицание (или унарный минус -) изменяет знак операнда целого или вещественного типа на противоположный.
Логическое отрицание (!) дает в результате значение 0 (ложь), если операнд отличен от нуля (истина), и значение 1 (истина), если операнд равен нулю (ложь). Тип операнд может быть логический, целочисленный, вещественный или указатель.
Рассмотрим данные операции на примере.
Текст программы
#include <iostream>
using namespace std;
int main()
{
int x=3, y=0;
bool f=false, v=true;
cout << -x<<"\t" <<!x <<endl;
cout << -y<<"\t" <<!y <<endl;
cout << f<<"\t" <<!f <<endl;
cout << v<<"\t" <<!v <<endl;
return 0;
}
Результат работы программы:
-3 0
0 1
0 1
1 0
Бинарные операции
Арифметические операции
Арифметические операции – операции применимые ко всем арифметическим типам (например, к целым и вещественным типам), а также к любым другим типам, которые могут быть преобразованы в арифметические (например, символьные типы). К бинарным арифметическим операциям относятся (в порядке убывания приоритета):
1) умножение (*), деление (/), остаток от деления (%);
2) сложение (+) и вычитание (-).
Операция деления
применима к операндам
Рассмотрим на примере операции деления и остаток от деления.
Текст программы
#include <iostream>
using namespace std;
int main()
{
cout << 100/24<<"\t"<<100/24.0<<endl;
cout << 100/21<<"\t"<<100.0/24<<endl;
cout << 21%3<<"\t" <<21%6<<"\t" <<-21%8<<endl;
return 0;
}
Результат работы программы:
4 4.7619
4 4.1667
0 3 -5
Операции отношения (<, <=,>, >=, ==, !=)
Операции отношения <, <=,>, >=, = =, != (меньше, меньше или равно, больше, больше или равно, равно, не равно соответственно) - это стандартные операции, которые сравнивают первый операнд со вторым. Операнды могут быть арифметического типа или указателями. Результатом операции является значение true (истина) или false(ложь) (напомним, что любое значение, не равное нулю, интерпретируется как истина , нулевое – как ложь) . Операции сравнения на равенство и неравенство имеют меньший приоритет, чем остальные операции сравнения.
Логические операции (&& и ||)
Логическая операция И (&&) возвращает значение истина тогда и только тогда, когда оба операнда принимают значение истина, в противном случае операция возвращает значение ложь. Логическая операция ИЛИ (||) возвращает значение истина тогда и только тогда, когда хотя бы один операнд принимает значение истина, в противном случае операция возвращает значение ложь. Логические операции выполняются слева направо, при этом приоритет операции (&&) выше приоритета операции (||). Если значения первого операнда достаточно, чтобы определить результат всей операции, то второй операнд не вычисляется.
Рассмотрим на примере данные операции.
Текст программы
#include <iostream>
using namespace std;
int main()
{
cout << "x \t y \t && \t ||" <<endl;
cout << "0 \t 1 \t "<< (0 && 1) <<" \t "<< (0 || 1) <<endl;
cout << "0 \t 1 \t "<< (0 && 1) <<" \t "<< (0 || 1) <<endl;
cout << "1 \t 0 \t "<< (1 && 0) <<" \t "<< (1 || 0) <<endl;
cout << "1 \t 1 \t "<< (1 && 1) <<" \t "<< (1 || 1) <<endl;
return 0;
}
Результат работы программы:
x y && ||
0 0 0 0
0 1 0 1
1 0 0 1
1 1 1 1
Операции присваивания (=,*=, /=, %=,+=, -=)
Операция простого присваивания обозначается знаком =. Формат операции простого присваивания (=):
операнд_2 = операнд_1;
В результате выполнения этой операции вычисляется значение операнда_1, и результат записывается в операнд_2. Возможно связать воедино сразу несколько операторов присваивания, записывая такие цепочки: a = b = c =100. Выражение такого вида выполняется справа налево: результатом выполнения c =100 является число 100, которое затем присваивается переменной b , результатом чего опять является 100, которое присваивается переменной a .
Кроме простой операции присваивания существуют сложные операции присваивания, например, умножение с присваиванием (*=), деление с присваиванием (/=), остаток от деления с присваиванием (%=), сложение с присваиванием (+=), вычитание с присваиванием (-=) и т.д (см. приложение 3).
В сложных операциях присваивания, например, при сложении с присваиванием , к операнду_2 прибавляется операнд_1, и результат записывается в операнд_2. То есть, выражение с += а является более компактной записью выражения с = с + а . Кроме того, сложные операции присваивания позволяют сгенерировать более эффективный код, за счет того, что в простой операции присваивания для хранения значения правого операнда создается временная переменная, а в сложных операциях присваивания значение правого операнда сразу записывается в левый операнд.
Тернарная операция
Условная операция ? :
Формат условной операции:
операнд_1? операнд_2 : операнд_3
Операнд_1 это логическое или арифметическое выражение. Он оценивается с точки зрения его эквивалентности константам true (истина) и false (ложь). Если результат вычисления операнда_1 равен истине, то результатом условной операции будет значение операнда_2,иначе — операнда_3. Вычисляется всегда либо операнд_2, либо операнд_3. Их тип может различаться. Условная операция является сокращенной формой условного оператора if , который будет рассмотрен позже.
Рассмотрим тернарную операцию на примере.
#include<iostream>
using namespace std;
int main()
{
int x, y, max;
cin >>x>>y;
(x>y)? cout <<x :cout<<y<<endl; //1
x=(x>y)? x : y; //2
cout<<max<<endl;
return 0;
}
Результат работы программы для x=11 и y=9:
11
11
Обратите внимание на то, что строка 1 и строка 2 решают одну и ту же задачу: нахождение наибольшего значения из двух целых чисел. Но в строке2 в зависимости от условия ( x > y ) условная операция записывает в переменную max либо значение x , либо значение y . После чего значение переменной max можно неоднократно использовать. В строке 1 наибольшее значение просто выводится на экран, и в дальнейшем это значение использовать будет нельзя, т.к. оно не было сохранено ни в какой переменной.
1.8 Выражения и преобразование типов
Выражение – это синтаксическая единица языка, определяющая способ вычисления некоторого значения. Выражения состоят из операндов, операций и скобок. Каждый операнд является в свою очередь выражением или одним из его частных случаев – константой, переменной или функцией. В приложении 4 (Математические функции) рассматриваются стандартные математические функции заголовочного файла math (cmath).
Примеры выражений:
(а + 0.12)/6
х && у || ! z
( t * sin ( x )- l .05 e 4)/((2 * k + 2) * (2 * k + 3))
Операции выполняются в соответствии с приоритетами (см. Приложение 3). Для изменения порядка выполнения операций используются круглые скобки. Если в одном выражении записано несколько операций одинакового приоритета, то унарные операции, условная операция и операции присваивания выполняются справа налево, остальные — слева направо. Например,
а = b = с означает a =( b = c ),
a + b + c означает (а + b) + с.
Порядок вычисления подвыражений внутри выражений не определен: например, нельзя считать, что в выражении ( sin ( x + 2) + cos ( y + 1)) обращение к синусу будет выполнено раньше, чем к косинусу, и что х + 2 будет вычислено раньше, чем у + 1.
Результат вычисления выражения характеризуется значением и типом. Например, если а и b — переменные целого типа и описаны так:
int а = 2, b = 5;
то выражение а + b имеет значение 7 и тип int.
В выражение могут
входить операнды различных типов.
Если операнды имеют одинаковый тип,
то результат операции будет иметь тот
же тип. Если операнды разного типа, то
перед вычислениями выполняются преобразования
более коротких типов в более длинные
для сохранения значимости и точности.
Иерархия типов данных приведена в следующей
таблице.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Преобразование типов в выражениях происходит неявно (без участия программистов) следующим образом: если их операнды имеют различные типы, то операнд с более «низким» типом автоматически будет преобразован к более «высокому» типу. Тип bool в арифметических выражениях преобразуется к типу int, при этом константа true заменяется 1, а false – 0.
В общем случае неявные преобразования могут происходить с потерей точности или без потери точности. Рассмотрим небольшой пример
Пример.
Текст программы
#include <iostream>
using namespace std;
int main()
{
int a=100, b;
float c=4.5, d;
d = a / c ; //1 – без потери точности
cout <<" d =" << d << endl ;
b = a / c ; //2 – с потерей точности
cout <<"b=" <<b<<endl;
return 0;
}
Результат работы программы:
d =22.2222
b=22
В строке 1 переменная а (тип int) делится на переменную c (тип float ). В соответствии с иерархий типов результат операции деления будет преобразован к типу float. Полученное значение записывается в переменную d(тип float). Таким образом, в строке 1 было выполнено одно преобразование от «низшего» типа к «высшему» и мы получили точный результат.
В строке 2 в результате операции деления также было получено значение, тип которого float. Но этот результат был записан в переменную b (тип int). Поэтому произошло еще одно преобразование – от «высшего» типа к «низшему», что повлекло потерю точности.