DEV Community

Cover image for Язык программирования Си. Глава(Chapter) 5
Amirshokh
Amirshokh

Posted on • Edited on

Язык программирования Си. Глава(Chapter) 5

1. Тело(Block) цикла внутри фигурных скобок {}, выполняется в зависимости от истинности условия(Condition) внутри круглых скобок ().

while(condition) //while condition is true
{block} //execute block of statements 
Enter fullscreen mode Exit fullscreen mode

2. Объект данных(Data Object) — область данных для хранения значений.
Модифицируемое l-значение(Modifiable lvalue) или значение локатора объекта(Object Locator Value) — любое имя или выражение, идентифицирующий конкретный объект данных.
r-значение(rvalue) или значение выражения(Value of an Expression) — может быть присвоено l-значению.

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
Enter fullscreen mode Exit fullscreen mode

3. Фундаментальные бинарные(Binary) или двухместные(Dyadic) и унарные(Unary) операторы(Operators) и их операнды(Operands), то есть аргументы операции.
Fundamental Operators

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.
/*
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
Enter fullscreen mode Exit fullscreen mode

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).
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
Enter fullscreen mode Exit fullscreen mode

6. Приоритет(Precedence) и ассоциативность(Associativity) операторов, которые совместно используют операнды(Shared Operands) и дерево выражений(Expression Tree).
Image description

7. Программа(Program) — это последовательный набор операторов(Series of Statements), в этой записи понимать как инструкция.
Оператор(Statement), пустой оператор(Null Statement) и составной оператор(Compound Statement) или блок(Block).

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];
}
Enter fullscreen mode Exit fullscreen mode

8. Полное выражение(Full Expression) — это выражение, которое не является подвыражением(Subexpression) другого выражения; значение выражения(Value of Expression); порядок вычисления выражений(не обязательно слева направо, если операнды не используют оператор совместно).
Побочные эффекты(Side Effects) — модификации объекта данных или файла, и точка следования(Sequence Point) — место оценки всех побочных эффектов при присваивании, инкрементировании или декрементировании.

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
Enter fullscreen mode Exit fullscreen mode

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).
//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
Enter fullscreen mode Exit fullscreen mode

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

Top comments (0)