Логические операции.
В С++ существует три логические операции:
Логическая операция И «&&»;
Логическая операция ИЛИ «| |»;
Логическая операция НЕ «!» или логическое отрицание.
Логические операции образуют сложное (составное) условие из нескольких простых (два или более) условий. Эти операции упрощают структуру программного кода в несколько раз. Да, можно обойтись и без них, но тогда количество ифов увеличивается в несколько раз, в зависимости от условия. В следующей таблице кратко охарактеризованы все логические операции в языке программирования С++, для построения логических условий.
Операции | Обозначение | Условие | Краткое описание |
И | && | a == 3 &&b > 4 | Составное условие истинно, если истинны оба простых условия |
ИЛИ | || | a == 3 ||b > 4 | Составное условие истинно, если истинно, хотя бы одно из простых условий |
НЕ | ! | !(a == 3) | Условие истинно, если a не равно 3 |
25. Функции: объявление, определение, передача аргументов по ссылке и по значению; входные и выходные параметры, возвращаемое значение, инструкция return.
Объявление функции задает имя функции, тип возвращаемого функцией значения (если таковое есть) и число и типы параметров, которые должны быть в вызове функции.
Например:
extern double sqrt(double);
extern elem* next_elem();
extern char* strcpy(char* to, const char* from);
extern void exit(int);
Семантика передачи параметров идентична семантике инициализации. Проверяются типы параметров, и когда нужно производится неявное преобразование типа. Например, если были заданы предыдущие определения, то
|
|
double sr2 = sqrt(2);
будет правильно обращаться к функции sqrt() со значением с плавающей точкой 2.0. Значение такой проверки типа и преобразования типа огромно.
Объявление функции может содержать имена параметров. Это может помочь читателю, но компилятор эти имена просто игнорирует.
Определения Функций
Каждая функция, вызываемая в программе, должна быть где-то определена (только один раз). Определение функции - это описание функции, в котором приводится тело функции.
Например:
extern void swap(int*, int*); // описание
void swap(int*, int*) // определение
{
int t = *p;
*p =*q;
*q = t;
}
Чтобы избежать расходов на вызов функции, функцию можно описать как inline, а чтобы обеспечить более быстрый доступ к параметрам, их можно описать как register. Оба средства могут использоваться неправильно, и их следует избегать везде где есть какие-либо сомнения в их полезности.
Передача Параметров
Когда вызывается функция, дополнительно выделяется память под ее формальные параметры, и каждый формальный параметр инициализируется соответствующим ему фактическим параметром. Семантика передачи параметров идентична семантике инициализации. В частности, тип фактического параметра сопоставляется с типом формального параметра, и выполняются все стандартные и определенные пользователем преобразования типов. Есть особые правила для передачи векторов, средство передавать параметр без проверки и средство для задания параметров по умолчанию.
|
|
Рассмотрим
void f(int val, int& ref)
{
val++;
ref++;
}
Когда вызывается f(), val++ увеличивает локальную копию первого фактического параметра, тогда как ref++ увеличивает второй фактический параметр.
Например:
int i = 1;
int j = 1;
f(i,j);
увеличивает j, но не i. Первый параметр, i, передается по значению, второй параметр, j, передается по ссылке. Использование функций, которые изменяют переданные по ссылке параметры, могут сделать программу трудно читаемой, и их следует избегать. Однако передача большого объекта по ссылке может быть гораздо эффективнее, чем передача его по значению. В этом случае параметр можно описать как const, чтобы указать, что ссылка применяется по соображениям эффективности, а также чтобы не позволить вызываемой функции изменять значение объекта:
void f(const large& arg)
{
// значение "arg" не может быть изменено
}
Аналогично, описание параметра указателя как const сообщает читателю, что значение объекта, указываемого указателем, функцией не изменяется.
|
|
Например:
extern int strlen(const char*); // из
extern char* strcpy(char* to, const char* from);
extern int strcmp(const char*, const char*);
Важность такой практики растет с размером программы.
Семантика передачи параметров отлична от семантики присваивания. Это важно для const параметров, ссылочных параметров и параметров некоторых типов, определяемых пользователем.
Возврат Значения
Из функции, которая не описана как void, можно (и должно) возвращать значение. Возвращаемое значение задается оператором return.
Например:
int fac(int n) {return (n>1)? n*fac(n-1): 1; }
В функции может быть больше одного оператора return:
int fac(int n)
{
if (n > 1)
return n*fac(n-1);
else
return 1;
}
Как и семантика передачи параметров, семантика возврата функцией значения идентична семантике инициализации. Возвращаемое значение рассматривается как инициализатор переменной возвращаемого типа. Тип возвращаемого выражения проверяется на согласованность с возвращаемым типом и выполняются все стандартные и определенные пользователем преобразования типов.
Например:
double f()
{
//...
return 1; // неявно преобразуется к double(1)
}
Каждый раз, когда вызывается функция, создается новая копия ее параметров и автоматических переменных. После возврата из функции память используется заново, поэтому возвращать указатель на локальную переменную неразумно.
|
|
Иногда необходимо прервать выполнение программы задолго до Того, как будут выполнены все ее строки. Для этой цели в языках C/C++ существует уже знакомая вам инструкция return, которая завершает выполнение той функции, в которой она была вызвана.
Дата добавления: 2015-12-21; просмотров: 19; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!