Язык программирования Си. Глава(Chapter) 5
Tags: c, russian
Published: 2022-06-24 17:53:30

**1.** Тело(_Block_) цикла внутри фигурных скобок `{}`, выполняется в зависимости от истинности условия(_Condition_) внутри круглых скобок `()`.
```c
while(condition) //while condition is true
{block} //execute block of statements 
```
**2.** Объект данных(_Data Object_) — область данных для хранения значений.
Модифицируемое l-значение(_Modifiable lvalue_) или значение локатора объекта(_Object Locator Value_) — любое имя или выражение, идентифицирующий конкретный объект данных.
r-значение(_rvalue_) или значение выражения(_Value of an Expression_) — может быть присвоено l-значению.
```c
int n, *ptr1, *ptr2, arr[5];
const int pi = 3.14;

n = 3; //variable n is lvalue and literal 3 is rvalue
n + 2 = 5; //error: expression 'n + 2' is not lvalue
((n + 4 < 1) ? ptr1 : ptr2) = arr; //conditional operator returns lvalue
pi = 6.28; //error: variable pi is non-modifiable lvalue
ptr1 = (ptr2 = &n); //variable n is lvalue but expression '&n' is rvalue, variable ptr2 is lvalue, expression (ptr2 = &n) is rvalue
ptr1 = &(n = pi); //error: expression (n = pi) is rvalue and doesn't refer to specific memory location therefore its address can't be taken
```

**3.** Фундаментальные бинарные(_Binary_) или двухместные(_Dyadic_) и унарные(_Unary_) операторы(_Operators_) и их операнды(_Operands_), то есть аргументы операции.
![Fundamental Operators](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ap8zw3468f60jjunck1k.png)

**4.** Арифметические(_Arithmetic_) операторы:
- операции сложения(_Addition_) и вычитания(_Subtraction_): `5 + 4` и `a - b`;
- операции знака(_Sign_): `-4` и `+a`;
- операция умножения(_Multiplication_): `2 * 2` или `a * b`;
- операция деления(_Division_) и деления по модулю(_Modulus_) с усечением в направлении нуля(_Truncating Toward Zero_): `4 / 2` и `a % b`.
```c
/*
division works according to formule:
a = b * q + r
a / b = floor(a / b) = q
a % b = a - b * floor(a / b)
a = b * (a / b) + (a % b)
*/

11 / -5 == -2; //-2.2 is truncated to -2 not -3
-11 / 5 == -2; //quotient is floored
11 % -5 == 1; //dividend is positive, remainder is also positive
-11 % 5 == -1; //remainder is nagative like dividend
```

**5.** Дополнительные операции
- операция инкремента(_Increment_) и декремента(_Decrement_) в префиксной(_Prefix_) и постфиксной(_Postfix_) записи: `++a` и `a--` соответственно;
- операция присваивания(_Assignment_) и множественное присваивание(_Multiple Assignment_): `a = 1` и `a = b = c`;
- оператор `sizeof` и возвращаемый тип `size_t`(обычно `unsigned int` или `unsigned long` в зависимости от системы): `sizeof 2`, `sizeof b` или `sizeof(int)`.
```c
int a = 1, b = 1;
int a_post, b_pre;
a_post = a++; //a = 2, a_post = 1
b_pre = ++b; //b = 2, b_pre = 2
```

**6.** Приоритет(_Precedence_) и ассоциативность(_Associativity_) операторов, которые совместно используют операнды(_Shared Operands_) и дерево выражений(_Expression Tree_).
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pkl5mje4yk4axz5kw8pd.png)

**7.** Программа(_Program_) — это последовательный набор операторов(_Series of Statements_), в этой записи понимать как инструкция.
Оператор(_Statement_), пустой оператор(_Null Statement_) и составной оператор(_Compound Statement_) или блок(_Block_).
```c
int a = b + 2; //example of a statement
3; //another example of a statement

; //example of null statement
;; //two null statements

//example of compund statement bound in braces
{
    3 + 3 == 6;
    ;
    int arr[10];
}
```

**8.** Полное выражение(_Full Expression_) — это выражение, которое не является подвыражением(_Subexpression_) другого выражения; значение выражения(_Value of Expression_); порядок вычисления выражений(не обязательно слева направо, если операнды не используют оператор совместно).
Побочные эффекты(_Side Effects_) — модификации объекта данных или файла, и точка следования(_Sequence Point_) — место оценки всех побочных эффектов при присваивании, инкрементировании или декрементировании.
```c
a = 6 + (b = 3 + 8); //satement equivalent to statement 17;
a = 6 + (b = 3 + 8) //full expression has value 17
6 + (b = 3 + 8) //subexpression has value 17
b = 3 + 8 //subexpression has value 11
3 + 8 //subexpression has value 11
3 //subexpression has value 3

//assigning 11 to b and 17 to a is side effect of statement
c = 0; //here side effect is assigning 0 to c

a = 1; b = 8; // ; is a sequence point
while (count++ < 10) //end of condition is sequence point
    printf("%d", count); //count was incremented in condition
```

**9.** Неявные(_Implicit_) и явные(Explicit) преобразования типов(_Type Conversions_):
- при вычислении выражений `char` и `short`, `signed` и `unsigned` автоматически преобразуются в `int` или `unsigned int`, например `unsigned short` преобразуется в `unsigned int`, если размеры `short` и `int` в реализации равны;
- при передаче в качестве аргумента типы `char` и `short` преобразуются в `int`, а `float` в `double`.
- повышения(_Promotions_) преобразуются по порядку `int -> unsigned int -> long -> unsigned long -> long long -> unsigned long long -> float -> double -> long double`;
- понижения(_Demotions_) задаются с помощью операции приведения(_Cast Operator_): `(int)` или `(double)`;
- усечение(_Truncation_) — обрезание информации(см. Глава 4.6).
```c
//Implicit type conversions
true + true; //promoted to int
'z' - 'a'; //promoted to int
10 * 0.1f; //promoted to float
int pi = 3.14; //demoted to int
double a = 1; //promoted to double

//Explicit type conversions
(int)'a'; //'a' casted to int
(int)(3.14 - true); //(3.14 - true) casted to int
(double)(1 / 3); //(1 / 3) casted to double but the result is 0
(double)1 / (double)3 //1 and 3 casted to double now division is 0.33...
(char)INT_MAX; //INT_MAX casted and demoted with truncation to char
```

> Язык программирования Си 6 издание. Стивен Прата
> C Primer Plus 6th edition. Stephen Prata