Операторы присвоения в СИ
Синтаксис оператора присвоения языка СИ имеет вид:LValue = RValue;
LValue – это то куда будет записано значение. В роли такого объекта в СИ может выступать только переменная.
RValue – это то значение чего мы запишем в LValue. А в этой роли могут выступать такие объекты как:
переменная,
константа,
оператор вызова функции,
математическое или логическое выражение.
Примеры присвоений
int a, b, c;
double x, y;
a = 5; b = 4; c = a + b;
x = 5.0; y = exp(x);
Усовершенствованные операторы присвоений в СИ
В СИ присутствуют так называемые усовершенствованные операторы присвоения, выглядят они так:LValue X= RValue; где X – это одна операция из набора: + - * / % ^ & | << >>. это является аналогией оператора присвоения:
LValue = LValue X RValue;
К примеру:
a += b; ≡ a = a + b;
В языке СИ все математические операции можно разделить на 2 группы:
1. математические операции для вещественных и целочисленных вычислений;
2. математические операции только для целочисленных вычислений.
К математическим операциям для вещественных и целочисленных вычислений языка СИ относят обычные арифметические операции:
сложения (+),
вычитания (-),
умножения (*), деления (/).
Соответствие типа результата от типов операндов
Тип первого операнда | Тип второго операнда | Тип результата |
целый | целый | целый |
целый | вещественный | вещественный |
вещественный | целый | вещественный |
вещественный | вещественный | вещественный |
Особенности языка СИ
Рассмотрим одну из особенностей на примере:int a,b;
double c;
a = 10;
b = 4;
c = a / b; // c будет равно 2, т.к выполняется операция не деления, а деления нацело или же:
double x = 1 / 3; // x будет равен 0, по той же причине что и в предыдущем примере
Операции для целочисленных вычислений
К операциям целочисленных вычислений относятся:операция взятия остатка от деления,
побитовые операции,
операции сдвигов,
операции инкремента и декремента.
Операция взятия остатка от деления(mod) является бинарной операцией и в языке СИ обозначается символом процента (%). Пример вычисления:
int a = 10, b = 3, c;
c = a % b; // с будет равно 1
Побитовые операции в СИ
Побитовые операции языка СИ представлены тремя бинарными и одной унарной операцией. К бинарным побитовым операциям относятся:операция «И» (&),
операция «ИЛИ» (|)
операция «Исключающее ИЛИ» (^).
Вот таблица истинности для этих операций:
первый операнд | второй операнд | операция | ||
и | или | исключающее или | ||
0 | 0 | 0 | 0 | 0 |
1 | 0 | 0 | 1 | 1 |
0 | 1 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
Побитовые операции
Унарной побитовой операцией является операция отрицания, обозначаемая символом тильды (~).
Пример:unsigned char a = 10, b; //a: 00001010 = 10
b = ~a; //b: 11110101 = 245
Операции сдвига
Операции сдвига осуществляют побитовый сдвиг целого значения, указанного в первом операнде, вправо (символ >>) или влево (символ
<<) на указанное во втором операнде целое число бит. Пример: unsigned char a = 10, b, c; //a: 00001010 = 10
b = a << 2; //b: 00101000 = 40
c = a >> 1; //c: 00000101 = 5
Операции инкремента и декремента
Операции инкремента (знак ++) и декремента (знак --) являются унарными и осуществляют увеличение и уменьшение целого значения на
единицу соответственно.int a = 10, b, c;
b = ++a //пред- инкремент b == 11
c = a++; //пост- инкремент с == 11
В современных языках программирования (в том числе и языке СИ стандарта С99) данные операции могут использоваться и для вещественных значений. Пример:
double x = 12.5;
x++;
printf("%lf\n”,x); //вывод: 13.5
Операции отношения (сравнения)
В языках программирования операции отношения (сравнения) являются бинарными операциями, осуществляющими сравнение двух операндов и
возвращающие результат сравнения в виде логического значения. В языке СИ принято логические значения ИСТИНА и ЛОЖЬ интерпретировать
посредством целочисленных значений: 0 – ЛОЖЬ, 1 – ИСТИНА.
Обозначение Название
> Больше
< Меньше
>= Больше или равно
<= Меньше или равно
== Равно
!= Не равно
Примеры
Несколько примеров использования операций сравнения:
int a=5, b=4, c=10, x, y;
x = a > b; //x == 1
y = c == a; //y == 0
Логические операции в СИ
Логические операции – унарные или бинарные операции, осуществляющие действия над логическими
значениями и возвращающие логическое значение. Набор логических операций у разных языков программирования может быть различен.Логические операции
название | обозначение | описание |
и | && | Логическое «И» – возвращает значение ИСТИНА, если оба операнда имеют значение ИСТИНА |
или | || | Логическое «ИЛИ» - возвращает значение ИСТИНА, если хотя бы один из операндов имеет значение ИСТИНА |
не | ! | Логическое «НЕ» - унарная операция, инвертирует логическое значение своего операнда |
Примеры логических операций:
int a=1, b=0, c, d; //a – ИСТИНА, b – ЛОЖЬ
c = a || b; //c == 1
d = !b && a; //d == 1
Приоритеты операций
++, -- | Операции пост- инкремента и декремента |
( ) | Вызов функции, группировка операций |
[ ] | Обращение к элементу массива |
-> | Обращение к полю структуры или объединения через указатель |
. | Обращение к полю структуры или объединения |
++, -- | Операции пред-инкремента и декремента |
! | Логическое «НЕ» |
~ | Бинарное отрицание(инверсия) |
+, - | Унарные плюс и минус |
& | Операция взятия адреса |
* | Разыменование указателя |
sizeof | Оператор определения размера |
(type) | Оператор преобразования типа |
* | Умножение |
/ | Деление |
% | Взятие остатка от деления |
+ | Сложение |
- | Вычитание |
<<, >> | Побитовые сдвиги влево и вправо |
<, <=, >, >= | Операции сравнения |
==, != | Операции сравнения |
& | Побитовое «И» |
^ | Побитовое «Исключающее ИЛИ» |
| | Побитовое «ИЛИ» |
<&& | Логическое «И» |
|| | Логическое «ИЛИ» |
?: | Условная операция |
= | Оператор простого присвоения |
*=, /=, %=, +=, -=, <<=, >>=, &=, ^=,|= | Усовершенствованные операторы присвоения |
, | Запятая |
Особенности трансляторов
Не определяется порядок, в котором вычисляются аргументы функции при ее вызове. Поэтому следующий оператор может дать различные результаты при трансляции разными компиляторами:
printf("%d %lf\n”, ++n, pow(2.0,n));
Результат будет зависеть от того, получает ли n приращение до или после вызова функции pow. Чтобы решить проблему достаточно записать так: n++;
printf("%d %lf\n”, n,pow(2.0,n));
Схема автоматического приведения типа
1.Если какой-либо из операторов имеет тип long double, то и другой приводится к long double.
2.Иначе, если какой-либо из операторов имеет тип double, то и другой приводится к double.
3.Иначе, если какой-либо из операторов имеет тип float, то и другой приводится к float.
4.Иначе, для обоих операндов выполняется расширение целого типа; затем, если один из операндов имеет тип unsigned long int, то другой преобразуется в unsigned long int.
5.Иначе, если один из операндов имеет тип long int, а другой – unsigned int, то результат зависит от того, представляет ли long int все значения unsigned int; если это так, то операнд типа unsigned int
6.приводится к типу long int; если нет, то оба операнда преобразуются в unsigned long int.
7.Иначе, если один из операндов имеет тип long int, то и другой приводится к long int.
8.Иначе, оба операнда имеют тип int.
Оператор приведения типа
int a = 15, b = 2; double r = 0.0; r = a / b; //r == 7.0
Оператор приведения типа: (тип)выражение.
r = (double)a / b; //Правильно
r = (double) (a / b); //Неправильно
Условная операция
В языке СИ присутствует так называемая условная операция, которая имеет следующий синтаксис:
условие ? выражение №1 : выражение №2;
Пример условной операции. Необходимо ввести с клавиатуры два вещественных значения и вывести на экран максимальное из этих значений:
#include <stdio.h>
int main(int argc, char *argv[])
{
double x,y;
printf("Введите значения: ");
scanf("%lf %lf”,&x,&y);
double max = (x > y) ? x : y;
printf("Максимальное значение: %lf\n",max);
return 0;
}
Необходимо ввести с клавиатуры три вещественных значения и вывести на экран максимальное из этих значений:
#include <stdio.h>
int main(int argc, char *argv[])
{
double x, y, z;
printf("Введите значения: ");
scanf("%lf %lf %lf",&x,&y,&z);
double max = (x > y) ? ((x > z) ? x : z): ((y > z) ? y :z);
printf("Максимальное значение: %lf\n",max);
return 0;
}
Вещественное число вводится с клавиатуры. Возвести число в четвертую степень, используя только две операции умножения.
#include <stdio.h>
int main(int argc, char *argv[])
{
double a;
printf("Введите значение: ");
scanf("%lf",&a);
a *= (a *=a);
printf("Результат: %lf\n",a);
return 0;
}
Квадратное уравнение вида задается коэффициентами A, B и C. Определить какое количество корней имеет данное уравнение.
#include <stdio.h>
int main(int argc, char *argv[])
{
double a,b,c;
printf("Введите коэффициенты A, B и С: ");
scanf("%lf %lf %lf",&a,&b,&c);
double d = b*b-4*a*c;
int n = (d < 0.0)?0:(d > 0.0)?2:1;
printf("Количество корней: %d\n",n);
return 0;
}