1. Тело(Block) цикла внутри фигурных скобок {}
, выполняется в зависимости от истинности условия(Condition) внутри круглых скобок ()
.
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-значению.
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), то есть аргументы операции.
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
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
6. Приоритет(Precedence) и ассоциативность(Associativity) операторов, которые совместно используют операнды(Shared Operands) и дерево выражений(Expression Tree).
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];
}
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
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
Язык программирования Си 6 издание. Стивен Прата
C Primer Plus 6th edition. Stephen Prata
Top comments (0)