Программа. Обзор существующих парадигм программирования.

Операторы инкремента и декремента. Побитовые операторы языка

С++.Оператор инкремента ++ добавляет 1 к своему операнду, а оператор декремента – вычитает 1. Данные операторы имеют две формы: префиксную (++n) и постфиксную (n++). В первом случае значение переменной сначала увеличивается на 1, а затем используется в выражении, во втором случае – сначала используется, а затем увеличивается. То есть, если n = 5, то x = n++; установит x равным 5, а n равным 6.

Побитовые операторы

В Си имеется шесть операторов для манипулирования с битами. Их можно применять только к целочисленным операндам:

& - побитовое И.

| - побитовое ИЛИ.

^ - побитовое исключающее ИЛИ.

<< - сдвиг влево.

>> - сдвиг вправо.

~ - побитовое отрицание (унарный).

Операторы и выражения присваивания

Выражения вида i = i+2 можно записывать в сокращенном виде i+=2. Оператор +=, как и оператор =, называется оператором присваивания. Большинству бинарных операторов соответствуют операторы присваивания op=, где op – один из операторов: + - * : % << >> & ^

Операторы присваивания. Условный оператор. Оператор sizeof.

Операторы и выражения присваивания

Выражения вида i = i+2 можно записывать в сокращенном виде i+=2. Оператор +=, как и оператор =, называется оператором присваивания. Большинству бинарных операторов соответствуют операторы присваивания op=, где op – один из операторов: + - * : % << >> & ^

Условный оператор

Инструкции вида if (a>b) z = a; else z = b; в Си можно записать с помощью тернарного (имеющего три операнда) оператора ?: (оно запишется так: z = (a>b)?a:b;).

Операторы, которые будут рассмотрены позже

Оператор () относится к вызову функции. Операторы -> и . (точка) обеспечивают доступ к элементам структур. Оператор sizeof предназначен для получения размера объекта. Оператор * представляет собой косвенное обращение по указателю. Оператор & предназначен для получения адреса объекта. Оператор [] предназначен для индексации элементов массива. Оператор :: - оператор разрешения области видимости. Оператор new предназначен для создания динамического объекта, delete – для удаления динамического объекта.

8. Конструкция ветвления в языке С++: назначение, синтаксис,

примеры использования.

Порядок, в котором выполняются вычисления, определяется инструкциями управления. Выражение, скажем, x = 0, или i++, или printf(…) становится инструкцией, если в конце его поставить точку с запятой. Фигурные скобки используются для объединения объявлений в составную инструкцию, или блок (например, фигурные скобки, обрамляющие тело функции main, или скобки, объединяющие инструкции внутри цикла for). После правой фигурной закрывающей скобки точка с запятой не ставится.

Конструкция if-else Синтаксис конструкции:

if (выражение)

инструкция1;

[else инструкция2];

Сначала вычисляется выражение, если оно истинно (то есть отлично от нуля), выполняется инструкция 1, иначе инструкция 2.

Else связывают с ближайшим if, у которого нет else.

Например, в наборе инструкций:

if (a > 3)

if (b <=5)

c = 10;

else c = 20;

else относится ко второму if, что подчеркнуто с помощью отступов (обратите внимание на необходимость правильно форматировать ваш код).

Конструкция else-if.

Синтаксис конструкции:

if (выражение)

инструкция1;

else if (выражение)

инструкция2;

[else if (выражение)

инструкция3;]

[else инструкцияN;]

Выражения вычисляются по порядку: как только встречается выражение со значением «истина», выполняется соответствующая ему инструкция; на этом последовательность проверок завершается. Последняя else часть срабатывает, если не выполняются все предыдущие проверки.

9. Оператор выбора switch в С++: назначение, синтаксис, примеры

Использования.

Инструкция switch используется для выбора одного из многих вариантов. Оно проверяет, совпадает ли значение выражения с одним из значений, входящих в некоторое множество целых констант, и выполняет соответствующую этому выражению часть программы:

switch (выражение) {

case конст-выр: инструкции;

case конст-выр: инструкции;

default: инструкции;

}

Каждая ветвь case помечена одной или несколькими целочисленными константами или же константными выражениями. Если выяснилось, что ни одна из констант не подходит, то выполняется ветвь, помеченная словом default, если таковая имеется.

Инструкция break выполняет немедленный выход из переключателя switch:

switch (a){

case 1: cout << "Вы ввели 1"; break;

case 2: cout << "Выввели 2"; break;

case 3: cout << "Вы ввели 3"; break;

default: cout << "Вы неверно ввели число!"; break;

}

10. Цикл for в С++: назначение, синтаксис, примеры использования.

Циклы while и for

В цикле while (выражение) вычисляется выражение. Если его значение ненулевое, то выполняется инструкция, и вычисление выражения повторяется. Этот цикл продолжается до тех пор, пока выражение не станет равным нулю, после чего вычисления продолжатся с точки, расположенной сразу за инструкцией. Пример (вычисление факториала):

cout << "Введите число: ";

int a;

cin >> a;

cout << a << "! = ";

int b = 1;

while (a) // пока а не равно нулю

b *= a--; // умножаем b на a, затем уменьшаем а на единицу

cout << b;

Синтаксис цикла for:

for (выражение1; выражение2; выражение3)

инструкция;

Данная инструкция эквивалента следующей:

выражение1;

while (выражение2) {

инструкция;

выражение3;

}

Пример (вычисление факториала):

cout << "Введите число: ";

int a, b = 1;

cin >> a;

for (int i = 1; i <= a; i++)

b*=i;

cout << a << "! = " << b;

Цикл for чаще всего используется в случае, когда число итераций цикла известно до того, как он начнет выполняться (например, действия, выполняемые для всех элементов массива).

11. Циклы while и do..while в С++: назначение, синтаксис, примеры

Использования

Цикл do-while

Синтаксис:

do

инструкция;

while (выражение);

Это так называемый цикл с постусловием. Его отличие от обычного while заключается в том, что условие продолжения работы цикла находится после его тела. Благодаря этому операторы, составляющие тело цикла, будут гарантированно выполнены хотя бы один раз.

Инструкции break и continue

Оператор break прекращает выполнение ближайшего внешнего для него оператора цикла.

const int M=3, N=2;

int a[M][N] = {{0,2}, {3,0}, {5,6}};

int sum = 0;

for (int i = 0; i < M; i++)

{

for (int j = 0; j < N; j++)

{

if (a[i][j]==0) break;

sum += a[i][j];

}

}

cout << sum << endl;

Оператор continue передает управление на ближайшую внешнюю проверку условия продолжения цикла.

const int M=3, N=2;

int a[M][N] = {{0,2}, {3,0}, {5,6}};

int sum = 0;

for (int i = 0; i < M; i++)

{

for (int j = 0; j < N; j++)

{

if (a[i][j]==0) continue;

sum += a[i][j];

}

}

cout << sum << endl;

13.Структура программы на языке С++. Функция main.

В любой программе на языке Си обязательно должна присутствовать главная функция с фиксированным именем main. В соответствии со стандартом языка, функция main имеет две допустимых сигнатуры:

int main();

int main(int argc, char* argv[]);

Функция int _tmain(int argc, _TCHAR* argv[]) является макросом от компании Microsoft, который вызывает одну из двух функций:

int main(int argc, char* argv[]);или int wmain(int argc, wchar_t* argv[]); в зависимости от того, используется ли в проекте кодировка Unicode.

Перед именем каждой функции программы следует помещать сведения о типе воз-вращаемого значения (типе результата). Если функция ничего не возвращает, указывается тип void. Значение, возвращаемое функцией main(), может быть передано операционной системе для дальнейшего анализа.

Параметры функции main() позволяют организовать передачу данных из среды вы-полнения в исполняемую программу, минуя средства стандартной библиотеки ввода-вывода.

14.Ввод-вывод в языке С++ с помощью функций printf(), scanf().

Для вывода информации в Си достаточно часто используется функция printf() (форматная строка, список аргументов);

Прототип этой функции находится в файле <stdio.h>. Форматная строка ограничена двойными кавычками и может включать произвольный текст, управляющие символы и спецификации преобразования данных. Список аргументов может отсутствовать.

Произвольный текст выводится на экран непосредственно без изменений: printf("Привет, мир!");

Управляющие символы (перевод строки, табуляция) позволяют влиять на размеще-ние информации на экране.

Спецификации преобразования данных предназначены для управления формой внешнего представления значений аргументов функции printf(). Обобщенный формат спецификации: %флажки ширина_поля.точность модификатор спецификатор. Обязательными являются только % и спецификатор.

Примеры спецификаторов:

d – для целых десятичных чисел (тип int); u – для целых десятичных чисел без зна-ка (unsigned); f – для вещественных чисел.

Ширина поля – целое положительное число, определяющее длину (в позициях на экране) представления выводимого значения.

Точность - целое положительное число, определяющее количество цифр в дроб-ной части вещественного числа.

float f = 5.23232323;

printf("%5.3f",f);

Результат: 5,232.

В качестве модификаторов в спецификации преобразования используются симво-лы: h – для вывода значений short, l – для вывода значений long, L – для вывода значений типа long double. Например, для вывода переменной типа long int нужно использовать спецификатор формата %ld.

Функция scanf, обеспечивающая ввод, является аналогом printf. Она читает симво-лы из стандартного входного потока, интерпретирует их согласно спецификациям фор-матной строки и рассылает результаты в свои остальные аргументы.

15. Потоковый ввод-вывод в языке С++ (cin, cout).

Для того чтобы использовать стандартные потоки для ввода и вывода, необходимо включить заголовочный файл <iostream>. Для ввода используется операция >>, для вывода – операция <<. Компилятор определяет тип вводимой/выводимой переменной и соответствующим образом форматирует её.

#include <iostream>

using namespace std;

cin >> x; // Ввод значения в переменную x из стандартного потока cin

cout << x; // Вывод значения переменной x в стандартный поток cout

cin >> x >> y; // Ввод двух переменных

cout << "x = " << x << "\ny = " << y << endl; // Функция endl осуществляет перевод строки

Если при вводе или выводе произошла ошибка, в переменной состояния потока устанавливается соответствующий флаг. Проверить его значение можно с помощью функции fail.

cin >> x;

if (cin.fail())

cout << "Произошла ошибка при вводе\n";

16. Одномерные массивы в С++. Способы инициализации массивов.

Массив – это конечная именованная последовательность однотипных величин. Размерность массива – количество его элементов. Описание массива в программе отличается от описания простой переменной тем, что за именем переменной следуют квадратные скобки, в которых записывается размерность массива. Например: int a[3]; // массив из 3 целых чисел

float b[5]; // массив из 5 действительных чисел

char c[15]; // массив из 15 символов

Каждый элемент массива имеет свой номер, который называется индексом элемента. Индексация (то есть нумерация) элементов в С++ начинается с нуля. Например, массив int a[3] будет содержать элементы a[0], a[1], a[2].

Начальные значения элементов массива можно задать с использованием фигурных скобок, например:

int a[3]={1,2,3}; // a[0]=1, a[1]=2, a[2]=3

Значения элементам присваиваются по порядку. Если размерность массива больше, чем число введенных элементов, остальные будут проинициализированы нулями:

float b[5] = {5.5, 1.2, 1.3}; // b[0]=5.5, b[1]=1.2, b[2]=1.3, b[3]=0, b[4]=0

Размещение элементов массива в памяти выполняется на этапе компиляции, поэтому размерность массива задается константой или константным выражением.

const int M = 5, N = 3;

int a[M*N]={};

Допустимо не задавать размерность массива, в этом случае память будет выделена по числу элементов в списке инициализации:

double d[] = {1.5,2.5,3.5};

Для доступа к элементам массива используются квадратные скобки:

// d[0]=1.5, d[1]=2.5, d[2]=0

double d[3]={1.5,2.5};

d[2]=3.5; // d[2]=3.5

double sum = 0; // переменная для хранения суммы

for (int i = 0; i < 3; i++) sum += d[i]; cout << "Сумма:" << sum << endl; // Сумма: 7,5

17. Двумерные массивы в С++.Пример объявления двумерного массива (индексация его элементов показана на рис. 1):

int a[4][5]; // массив из 4 элементов, каждый из кот. является массивом из 5 эл-в. Двумерный массив располагается в памяти последовательно по строкам (в порядке наиболее быстрого изменения последнего индекса).

При инициализации многомерного массива он представляется либо как массив из массивов, при этом каждый массив заключается в свои фигурные скобки (в этом случае левую размерность при описании можно не указывать), либо задается общий список элементов в том порядке, в котором элементы располагаются в памяти:

int mass2 [][2] = { {1, 1}, {0, 2}, {1, 0} };

int mass2 [3][2] = {1, 1, 0, 2, 1, 0};

Пример работы с двумерным массивом (программа ищет номер строки двумерного массива, в которой больше всего нулей):

const int M = 4, N = 5; // размерности массива

int b[M][N]; // описание массива

int i, j; // счетчики циклов

for (i = 0; i<M; i++) // ввод массива

for (j = 0; j<N; j++) scanf("%d", &b[i][j]);

int istr = -1, max_count = 0; // номер искомой строки, максимальное количество

for (i = 0; i<M; i++)

{ // просмотр массива по строкам

int count = 0;

for (j = 0; j<N; j++) if ( b[i][j] == 0) count++;

if ( count > max_count)

{

istr = i ; max_count = count;

}

}

printf("Исходный массив:\n");

for (i = 0; i<M; i++){

for (j = 0; j<N; j++) printf("%d ", b[i][j]);

printf ("\n" ) ;}

if (istr == -1) printf("Нулевых элементов нет");

else printf("Hoмep строки: %d", istr + 1 );

Использования.

Для лексикографического сравнения строк используются функции int strcmp(строка1, строка2) и int stricmp(строка1, строка2). Первая сравнивает строки с учетом регистра, вторая – без. Все это относится только к латинице. Пример использования функции сравнения строк:

char s[80];

printf("Введите пароль: ");

gets(s);

if(strcmp(s, "pass"))

printf("Неверный пароль\n");

Для вычисления длины строки используется функция strlen (строка). Функция возвращает длину строки за вычетом нулевого байта. Эта функция полезна в случаях, если вам нужно последовательно обратиться ко всем символам строки, не нарушив при этом ее длину. Пример:

char len;

len=strlen(str);

for (i=0;i<len;i++) {

// работа со строкой, не изменяющая ее длину

}

Зачастую требуется преобразовать число в строку и наоборот. Есть несколько способов сделать это.

1) использовать функции sprintf и sscanf. Например, так:

char str[50];

int i=15;

int j;

sprintf(str, "%d", i); // Записать в str строковое представление i

sscanf(str, "%d", &j); // Записать в j число, содержащееся в строке str

sprintf(str, "i=%d and j=%d", i, j);

// содержимое str: "i=15 and j=15"

Функция int sprintf(строка, формат, [аргументы]) работает аналогично printf(), но выводит отформатированное содержимое не на экран, а в строку, указанную в качестве первого аргумента. Функция возвращает значение, равное числу символов, записанных в строку. Пример:

char buffer [50];

int n, a=5, b=3;

n=sprintf (buffer, "%d plus %d is %d", a, b, a+b);

printf ("[%s] is a %d char long string\n",buffer,n);

Функция int sscanf(строка, формат, [аргументы]) осуществляет считывание данных из строки и запись в аргументы в соответствии с форматом. Как и в обычной функции scanf(), перед аргументами ставится &.

Хотя sprintf и sscanf довольно удобны, у них есть несколько недостатков. Во-первых, они не всегда быстро работают, во-вторых не типобезопасны. Например, если в строке формата вы укажите, что передаете два целых, а вместо этого передадите два double, ошибка обнаружится только при выполнении программы и найти ее причину будет не так-то просто.

В-третьих, доступно целое семейство функций atof, atoi, atol и itoa, ltoa. Все они очень похоже между собой. Функции из первой группы преобразуют строку в число (float, int или long) в зависимости от окончания. Функции из второй группы выполняют обратное преобразование.

Пример (первый аргумент функции – число, второй аргумент – строка, третий аргумент – основание системы счисления):

char str1[5];

char str2[5];

char str3[5];

itoa(12, str1, 10); //str1=”12”

itoa(12, str1, 16); //str1=”C”

itoa(12, str1, 2); //str1=”1100”

strupr(строка) – преобразует строку в верхний регистр

strlwr(строка) – преобразует строку в верхний регистр

strlen(строка) – возвращает длину строки

strset(строка,символ) – заменяет все символы строки на указанный символ

strrev(строка) – меняет порядок символов в строке на противоположный*

char title[]="C++ strings";

cout << strupr(title) << endl;

cout << strlwr(title) << endl;

cout << strlen(title) << endl;

cout << strrev(title) << endl;

cout << strset(title,'x') << endl;

25.Указатель. Синтаксис объявления указателя. Способы инициализации указателей.Примеры. Указатель – это переменная, в которой хранится адрес области памяти.

Синтаксис объявления указателя на объект:

тип *имя_указателя;

* относится непосредственно к имени, поэтому ее требуется ставить перед именем каждого указателя в объявлении.

Инициализация указателя:

1) Присваиваем указателю адрес с помощью операции взятия адреса &;

char *pch = &ch; // заносим в pch адрес ch

int *pi = &i;

float *pf = &f;

double *pd = &d;

2) Присваиваем указателю значение другого инициализированного указателя;

int i = 10;

int *pi1 = &i; // pi1 указывает на i

int *pi2 = pi1; // pi2 тоже указывает на i

3) Присваиваем имя массива (оно трактуется как адрес начала массива)

int arr[3]={1,2,3};

int *parr = arr; // обратите внимание, что в этом случае не используется оператор взятия адреса &

4) Присваиваем адрес области памяти в явном виде;

char * pch = (char*)0xB8000000;

5) Присваиваем пустое значение.

double *pd = NULL;

float *pf = 0;

Разыменование указателей. Арифметические операции над указателями. Связь указателей и массивов. Примеры.

Операция разадресации (разыменования) предназначена для получения доступа к величине, адрес которой хранится в указателе.

int i = 10; // i = 10

cout << "Initial value of i = " << i << endl;

int *p = &i; // p указывает на i

cout << "Initial value of *p = " << *p << endl;

*p = 15; //*p – значение по адресу в p

cout << "New value of *p = " << *p << endl;

cout << "New value of i = " << i << endl;int k = *p; // k присвоить значение по адресу в p

cout << "Initial value of k = " << k << endl;

k = k + 3;

cout << "New value of k = " << k << endl;

cout << "New value of *p = " << *p << endl;

Initial value of i = 10

Initial value of *p = 10

New value of *p = 15

New value of i = 15

Initial value of k = 15

New value of k = 18

New value of *p = 15

Арифметические операции: сложение с константой, вычитание, инкремент и декремент. Автоматически учитывается размер типа переменной, на которую настроен указатель. Применяются в основном при работе с массивами. Инкремент перенастраивает указатель на следующий элемент массива, а декремент – на предыдущий. Фактически значение указателя изменяется на величину sizeof(тип)

int arr[5]={1,2,3,4,5}, *parr = arr;

// *parr = 1

++parr;

// *parr = 2

parr+=2;

// *parr = 4

Разность двух указателей – это разность их значений, деленное на величину типа в байтах

int arr[5]={10,12,3,15,5}, *parr1

= arr, *parr2 = &arr[3];

cout << "parr2 - parr1 = " <<

parr2 - parr1 << endl; // 3

cout << "*parr2 - *parr1 = " <<

*parr2 - *parr1 << endl; // 5

Программа. Обзор существующих парадигм программирования.

Под программой понимается логически упорядоченная последовательность команд, необходимая для управления компьютером.

это система идей и понятий, определяющих стиль написания компьютерных программ, а также образ мышления программиста.

Объе́ктно-ориенти́рованное, или объектное, программи́рование (в дальнейшем ООП) — парадигма программирования, в которой основными концепциями являются понятия объектов и классов.

Логи́ческое программи́рование — парадигма программирования, основанная на автоматическом доказательстве теорем, а также раздел дискретной математики, изучающий принципы логического вывода информации на основе заданных фактов и правил вывода.

Функциона́льное программи́рование —парадигма программирования, в которой процесс вычисления трактуется как вычисление значений функций в математическом понимании последних.

Структу́рное программи́рование — методология разработки программного обеспечения, в основе которой лежит представление программы в виде иерархической структуры блоков. Предложена в 70-х годах XX века Э. Дейкстрой, разработана и дополнена Н. Виртом.

В соответствии с данной методологией

Любая программа представляет собой структуру, построенную из трёх типов базовых конструкций:

последовательное исполнение — однократное выполнение операций в том порядке, в котором они записаны в тексте программы;

ветвление — однократное выполнение одной из двух или более операций, в зависимости от выполнения некоторого заданного условия;

цикл — многократное исполнение одной и той же операции до тех пор, пока выполняется некоторое заданное условие (условие продолжения цикла).

Декларативное программирование — термин с двумя различными значениями.

Согласно первому определению, программа «декларативна», если она описывает каково́ нечто, а не как его создать. Например, веб-страницы на HTML декларативны, так как они описывают что должна содержать страница, а не как отображать страницу на экране. Согласно второму определению, программа «декларативна», если она написана на исключительно функциональном, логическомили языке программирования с ограничениями.

Императи́вное программи́рование — это парадигма программирования, которая, описывает процесс вычисления в виде инструкций, изменяющих состояние программы. Императивная программа очень похожа на приказы, выражаемые повелительным наклонением в естественных языках, то есть это последовательность команд, которые должен выполнить компьютер.

3. Типы данных языка С++. Объявление переменных в С++.

В Си существует несколько базовых типов:

1)char – единичный байт, который может содержать один символ из допустимого символьного набора;

2)int – целое, обычно отображающее естественное представление целых в машине. Количество байт, отведенных под int, зависит от архитектуры процессора – используется размер, с которым процессору легче работать, а также от используемого компилятора.

3)float – число с плавающей точкой одинарной точности.

4)double – число с плавающей точкой двойной точности.

5)bool – логический. Величины логического типа могут принимать только значения true и false. 0 интерпретируется как false, любое другое значение как true.

6)wchar_t (появился в C++) – расширенный символьный. Предназначен для работы с набором символов, для кодировки которого недостаточно одного байта, например, Unicode. Размер этого типа зависит от реализации и, как правило, соответствует типу short.

7)void. Множество значений этого типа пусто. Он используется для определения возвращаемого значения функции, для указания пустого списка аргументов функции, как базовый тип для указателей и в операции приведения типов.

Все переменные должны быть объявлены раньше, чем будут использоваться. Объявление специфицирует (указывает) тип и содержит список из одной или нескольких переменных этого типа, например:

int a, b, c;

char ch;

В своем объявлении переменная может быть инициализирована (получить начальное значение), например:

int a, b = 3, c;

char ch = '\0';

К любой переменной в объявлении может быть применен квалификатор const для указания того, что ее значение далее не будет изменяться.

const double pi = 3.1415926;

4. Константы в языке С++. Численные, символьные, строковые константы.Целая константа, например, 1234, имеет тип int. Константа типа long завершается буквой l или L, например, 123456789L. Беззнаковые константы заканчивают буквой u или U, а окончание ul или UL обозначает unsigned long.

Если константа начинается с нуля, то мы имеем дело с ее восьмеричным представлением (056), если с 0x или 0Х – константа представлена в шестнадцатеричном виде.

Символьная константа есть целое, записанное в виде символа, обрамленного одиночными кавычками, например, 'u'. Значением символьной константы является численный код символа из набора символов на данной машине (например, '0' в кодировке ASCII представлен числом 48 и не имеет отношения к численному значению 0).

Некоторые символы в символьных и строковых константах записываются с помощью Esc-последовательностей, например, \n – символ перевода строки, \t – символ табуляции, \\ - символ обратной косой черты. Произвольный восьмеричный код можно задать в виде \ooo (трех восьмеричных цифр), а шестнадцатеричный – в виде \0xhh.

Символьная константа '\0' – это символ с нулевым значением, так называемый символ null.

Строковая константа – это нуль или более символов, заключенных в двойные кавычки, например, "Это строковая константа".

5. Арифметические операторы языка С++. Логические операторы и

операторы отношения языка С++. 1)

1)Арифметические операторы. К ним относятся +, -, *, / и оператор деления по модулю % (x % y дает остаток от деления х на y, если x делится на y нацело, результатом будет нуль). Бинарные операторы + и – имеют одинаковый приоритет, который меньше приоритета *, / и %, который, в свою очередь, ниже приоритета унарных операторов + и -. Арифметические операции одного приоритета выполняются слева направо.

2)Операторы отношения и логические операторы. Операторами отношения являются >, >=, <, <=. Все они имеют одинаковый приоритет. Сразу за ними идет приоритет операторов сравнения == и !=. Операторы отношения имеют более низкий приоритет, чем арифметические операторы.

Логические операторы – это && (AND) и || (OR). При их использовании нужно иметь в виду одну интересную особенность. Их операнды вычисляются слева направо, и вычисления прекращаются, когда становится известной истинность или ложность результата (то есть если x = 1, y = 0, то при вычислении x||y значение y не будет участвовать в вычислении результата). Приоритет && выше, чем у ||, но их приоритеты ниже, чем приоритет операторов отношения и равенства. Унарный оператор ! преобразует ненулевой операнд в 0, а нуль в 1.

Наши рекомендации