Оператор условного перехода if

А где же побитовое исключающее ИЛИ (XOR)?

Побитовое исключающее ИЛИ (XOR) — это логический оператор, который используется в некоторых языках программирования для проверки на истинность нечётного количества условий.


Побитовое исключающее ИЛИ (XOR)
Левый операнд Правый операнд Результат
false false false
false true true
true false true
true true false

В языке C++ нет такого оператора. В отличии от логических И/ИЛИ, к XOR не применяется короткий цикл вычислений. Однако его легко можно сымитировать, используя оператор неравенства ():

if (a != b) … // a XOR b (предполагается, что a и b имеют тип bool)

1 if(a!=b)…// a XOR b (предполагается, что a и b имеют тип bool)

Можно также расширить количество операндов:

if (a != b != c != d) … // a XOR b XOR c XOR d (предполагается, что a, b, c и d имеют тип bool)

1 if(a!=b!=c!=d)…// a XOR b XOR c XOR d (предполагается, что a, b, c и d имеют тип bool)

Следует отметить, что вышеприведенные шаблоны XOR работают только, если операнды имеют логический (а не целочисленный) тип данных. Если вы хотите, чтобы это работало и с целыми числами, то используйте .

Форма XOR, которая работает и с другими типами данных (с помощью оператор static_cast мы можем конвертировать любой тип данных в bool):

if (static_cast<bool>(a) != static_cast<bool>(b) != static_cast<bool>(c) != static_cast<bool>(d)) … // a XOR b XOR c XOR d, для любого типа, который может быть конвертирован в bool

1 if(static_cast<bool>(a)!=static_cast<bool>(b)!=static_cast<bool>(c)!=static_cast<bool>(d))…// a XOR b XOR c XOR d, для любого типа, который может быть конвертирован в bool

Оператор if-else

Когда выполнение основной ветки программы доходит до условного оператора if-else, то в зависимости от результата логического выражения в его заголовке выполняются разные блоки кода. Если логическое выражение вернуло true, то выполняется один блок (в Паскале начинается со слова then), если false – то другой (начинается со слова else). После выполнения одного из вложенных блоков кода, ход программы возвращается в основную ветку. Другой вложенный блок не выполняется.

Например, программа должна определять, ввел пользователь четное или нечетное число, и выводить на экран сообщение. Тогда программный код на языке Pascal может быть таким:

var n integer;
begin
    write ('Введите целое число: ');
    readln (n);
 
    if n mod 2 =  then
        write ('Оно четное.')
    else
        write ('Оно нечетное.');
 
readln
end.

Бывают неполные формы условных операторов. В таком случае вложенный в if блок кода выполняется только в случая true логическом выражении заголовка. В случае false выполнение программы сразу передается в основной блок. Понятно, что ветка else в таком случае отсутствует.

В примере ниже, если переменная имеет значение меньше нуля, то ее значение изменяется (находится модуль числа). Если же значение переменной изначально больше нуля, то блок кода при операторе if вообще не выполняется, т.к. не соблюдено условие (n<0).

var n integer;
begin
    write ('Введите целое число: ');
    readln (n);
 
    if n <  then
        n = abs (n);
 
    write (n);
 
readln
end.

В качестве условия может стоять любое выражение, результатом вычисления которого является одно из булевых значений — true или false.

Непосредственно после then может стоять только один оператор. При необходимости выполнения нескольких операторов они должны быть заключены в операторные скобки begin-end. Пример программы, которая меняет значения переменных местами, только если эти значения различны. Блок if содержит четыре выражения, поэтому заключен в begin-end.

var
    a,b,c integer;
 
begin
    write('a=');
    readln(a);
    write('b=');
    readln(b);
 
    if a <> b then begin
        c = a;
        a = b;
        b = c;
        writeln('a=',a,'; b=',b);
    end
    else
        writeln('Введены одинаковые числа');
 
readln;
end.

Допустимо вложение одного оператора if (или if-else) в другой

При этом следует соблюдать осторожность, т.е. бывает трудно определить какому if (внешнему или внутреннему) принадлежит ветка else

Рекомендуют использовать вложенную конструкцию if, только в ветке else. К тому же в языке Паскаль действует следующее правило: каждому then соответствует ближайшее else, не задействованное при установлении соответствия с другим then. Глубина вложенности операторов if может быть сколь угодно большой, но разобраться в таком коде будет очень сложно.

Оператор case (оператор выбора)

Кроме оператора if в языке программирования Паскаль предусмотрен так называемый переключатель case. Его можно трактовать как некий вопрос, имеющий большое число ответов (а не только два, как это имеет место в операторе if-else). Однако в отличие от if, case имеет ряд принципиальных ограничений. Его формат следующий:

case селектор of 
	значение1 оператор1;
	значение2 оператор2;
	значение3 оператор3;
	...
	else операторN
end;

В заголовке оператора case вместо логического выражения фигурирует переменная, которую называют селектором. До этого в программе ей присваивается какое-либо значение. Эта переменная может иметь только перечисляемый тип (например, она не может быть вещественного типа). По ходу выполнения оператора case, значение переменной-селектора сравнивается с различными, описанными в нем альтернативами (метками-значениями). Как только совпадение будет найдено, то выполняется блок кода при данной метке и происходит выход в основную ветку программы. Значения-метки являются константами, которые может принимать селектор. Их тип и тип селектора должны быть совместимы по присваиванию.

Если совпадений не будет, то выполняется блок else. Если блок else отсутствует (он является не обязательным), то никакой блок кода в операторе case не выполняется.

var n integer;
begin
    write ('Введите класс школы: ');
    readln (n);
 
    case n of
        1..4 writeln ('Младшие классы.');
        5..8 writeln ('Средняя школа.');
        9,11 writeln ('Старшие классы. Выпускной.');
        10 writeln ('Старшие классы.');
        else writeln ('Error')
    end;
 
readln
end.

На использование оператора выбора накладываются следующие ограничения:

Логические операции в C++

Есть тип данных bool (булев тип), в котором хранится значение либо истина, либо ложь. Благодаря ему и возможно ветвление.

Чтобы поместить в переменную булева типа какое-то значение, мы можем самостоятельно написать его (true или false) или ввести какое-либо логическое утверждение:

  • число a больше числа b;
  • имя пользователя — Игорь;
  • сегодня четверг и так далее.

Дальше компьютер проверяет правдивость такого утверждения и возвращает результат.

Для написания таких утверждений необходимы логические операторы:

  • > — больше;
  • < — меньше;
  • == — равно;
  • ! = — не равно;
  • >= — больше или равно;
  • <= — меньше или равно.

Вот несколько примеров:

При попытке вывести значение переменной result программа выведет 1 или 0.

Использование логических операторов в ветвлениях if/else

Также вы можете проверить сразу несколько условий в ветвлениях if/else, используя логические операторы:

#include <iostream> int main() { std::cout << «Enter an integer: «; int a; std::cin >> a; std::cout << «Enter another integer: «; int b; std::cin >> b; if (a > 0 && b > 0) // && — это логическое И. Проверяем, являются ли оба условия истинными std::cout << «Both numbers are positive\n»; else if (a > 0 || b > 0) // || — это логическое ИЛИ. Проверяем, является ли истинным хоть одно из условий std::cout << «One of the numbers is positive\n»; else std::cout << «Neither number is positive\n»; return 0; }

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

#include <iostream>

intmain()

{

std::cout<<«Enter an integer: «;

inta;

std::cin>>a;

std::cout<<«Enter another integer: «;

intb;

std::cin>>b;

if(a>&&b>)// && — это логическое И. Проверяем, являются ли оба условия истинными

std::cout<<«Both numbers are positive\n»;

elseif(a>||b>)// || — это логическое ИЛИ. Проверяем, является ли истинным хоть одно из условий

std::cout<<«One of the numbers is positive\n»;

else

std::cout<<«Neither number is positive\n»;

return;

}

Условные ветвления if/else

Самыми простыми условными ветвлениями в языке С++ являются стейтменты if/else. Они выглядят следующим образом:

Либо так:

называется условием (или «условным выражением»). Если результатом является true (любое ненулевое значение), то выполняться будет . Если же результатом является false (0), то выполняться будет . Например:

#include <iostream> int main() { std::cout << «Enter a number: «; int a; std::cin >> a; if (a > 15) std::cout << a << » is greater than 15\n»; else std::cout << a << » is not greater than 15\n»; return 0; }

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

#include <iostream>

intmain()

{


std::cout<<«Enter a number: «;

inta;

std::cin>>a;

if(a>15)

std::cout<<a<<» is greater than 15\n»;

else

std::cout<<a<<» is not greater than 15\n»;

return;

}

The if Statement

Use the statement to specify a block of C++ code to be executed if a condition is .

Syntax

if (condition) {  // block of code to be executed if the condition is true}

Note that is in lowercase letters. Uppercase letters (If or IF) will generate an error.

In the example below, we test two values to find out if 20 is greater than 18. If the condition is , print some text:

if (20 > 18) {  cout << «20 is greater than 18»;}

We can also test variables:

In the example above we use two variables, x and y, to test whether x is greater than y (using the operator). As x is 20, and y is 18, and we know that 20 is greater than 18, we print to the screen that «x is greater than y».

C++ Exercises

Условные выражения

Последнее обновление: 19.06.2017

Отдельный набор операций представляет условные выражения. Такие операции возвращают логическое значение, то есть значение типа bool: true, если выражение истинно, и false, если выражение ложно. К подобным операциям относятся операции сравнения и логические операции.

Операции сравнения

В операциях сравнения сравниваются два операнда и возвращается значение типа bool — true, если выражение верно, и false, если выражение неверно.

  • ==

    Сравнивает два операнда на равенство. Если они равны, то операция возвращает true, если не равны, то возвращается false:

    int a = 10;
    int b = 4;
    bool c = a == b; // false
    
  • !=

    Сравнивает два операнда и возвращает true, если операнды не равны, и false, если они равны.

    int a = 10;
    int b = 4;
    bool c = a != b; 	// true
    bool d = a!=10;		// false
    
  • <

    Операция «меньше чем». Возвращает true, если первый операнд меньше второго, и false, если первый операнд больше второго:

    int a = 10;
    int b = 4;
    bool c = a < b; // false
    
  • >

    Операция «больше чем». Сравнивает два операнда и возвращает true, если первый операнд больше второго, иначе возвращает false:

    int a = 10;
    int b = 4;
    bool c = a > b;     // true
    bool d = a > 25;    // false
    
  • <=

    Операция «меньше или равно». Сравнивает два операнда и возвращает true, если первый операнд меньше или равен второму. Иначе возвращает false.

    int a = 10;
    int b = 4;
    bool c = a <= b;     // false
    bool d = a <= 25;    // true
    
  • >=

    Операция «больше или равно». Сравнивает два операнда и возвращает true, если первый операнд больше или равен второму, иначе возвращается false:

    int a = 10;
    int b = 4;
    bool c = a >= b;     // true
    bool d = a >= 25;    // false
    

Операции <, > <=, >= имеют больший приоритет, чем == и !=.

Логические операции

Также в C# определены логические операторы, которые также возвращают значение типа bool. В качестве операндов они принимают значения типа bool. Как правило, применяются к отношениям и объединяют несколько операций сравнения.

  • |

    Операция логического сложения или логическое ИЛИ. Возвращает true, если хотя бы один из операндов возвращает true.

    bool x1 = (5 > 6) | (4 < 6); // 5 > 6 - false, 4 < 6 - true, поэтому возвращается true
    bool x2 = (5 > 6) | (4 > 6); // 5 > 6 - false, 4 > 6 - false, поэтому возвращается false
    
  • &

    Операция логического умножения или логическое И. Возвращает true, если оба операнда одновременно равны true.

    bool x1 = (5 > 6) & (4 < 6); // 5 > 6 - false, 4 < 6 - true, поэтому возвращается false
    bool x2 = (5 < 6) & (4 < 6); // 5 < 6 - true, 4 < 6 - true, поэтому возвращается true
    
  • ||

    Операция логического сложения. Возвращает true, если хотя бы один из операндов возвращает true.

    bool x1 = (5 > 6) || (4 < 6); // 5 > 6 - false, 4 < 6 - true, поэтому возвращается true
    bool x2 = (5 > 6) || (4 > 6); // 5 > 6 - false, 4 > 6 - false, поэтому возвращается false
    
  • &&

    Операция логического умножения. Возвращает true, если оба операнда одновременно равны true.

    bool x1 = (5 > 6) && (4 < 6); // 5 > 6 - false, 4 < 6 - true, поэтому возвращается false
    bool x2 = (5 < 6) && (4 < 6); // 5 < 6 - true, 4 < 6 - true, поэтому возвращается true
    
  • !

    Операция логического отрицания. Производится над одним операндом и возвращает true, если операнд равен false. Если операнд равен true, то операция возвращает false:

    bool a = true;
    bool b = !a;    // false
    
  • ^

    Операция исключающего ИЛИ. Возвращает true, если либо первый, либо второй операнд (но не одновременно) равны true, иначе возвращает false

    bool x5 = (5 > 6) ^ (4 < 6); // 5 > 6 - false, 4 < 6 - true, поэтому возвращается true
    bool x6 = (50 > 6) ^ (4 / 2 < 3); // 50 > 6 - true, 4/2 < 3 - true, поэтому возвращается false
    

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

В выражении будут вычисляться оба значения — x и y.

В выражении же сначала будет вычисляться значение x, и если оно равно , то вычисление значения y уже смысла не имеет, так как у нас в любом случае уже z будет равно . Значение y будет вычисляться только в том случае, если x равно

То же самое касается пары операций . В выражении будут вычисляться оба значения — x и y.

В выражении же сначала будет вычисляться значение x, и если оно равно , то вычисление значения y уже смысла не имеет, так как у нас в любом случае уже z будет равно . Значение y будет вычисляться только в том случае, если x равно

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

НазадВперед

Ускоренное вычисление

В PL/SQL используется ускоренное вычисление условий; иначе говоря, вычислять все выражения в условиях не обязательно. Например, при вычислении выражения в следующей конструкции   PL/SQL прекращает обработку и немедленно выполняет ветвь , если первое условие равно или :

PL/SQL прерывает вычисление, если равно или , потому что ветвь выполняется только в случае истинности всего выражения, а для этого оба подвыражения должны быть равны . Как только обнаруживается, что хотя бы одно подвыражение отлично от , дальнейшие проверки излишни — ветвь все равно выбрана не будет.

Изучая поведение ускоренного вычисления в PL/SQL, я обнаружил нечто интересное: его поведение зависит от контекста выражения. Возьмем следующую команду: 

В отличие от случае с командой , если условие1 равно , ускоренное вычисление применяться не будет. Почему? Потому что результат может быть равен или в зависимости от условия2. Для команды оба значения и ведут к ветви , поэтому ускоренное вычисление возможно. Но для присваивания должно быть известно конечное значение, и ускоренное вычисление в этом случае может (и будет) происходить только в том случае, если условие1 равно .


Аналогичным образом работает ускоренное вычисление в операциях : если первый операнд в конструкции равен , PL/SQL немедленно выполняет ветвь :

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

Сначала проверяется простое_условие, и если его результата достаточно для определения конечного результата операции (то есть если результат равен ), более затратное условие не проверяется, а пропущенная проверка улучшает быстродействие приложения.

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

Ускоренное вычисление легко имитируется при помощи вложения :

проверяется только в том случае, если простое_условие окажется истинным. Происходит то же, что при ускоренном вычислении, но зато при чтении программы можно с первого взгляда сказать, что же в ней происходит. Кроме того, сразу понятно, что в соответствии с намерениями программиста должно проверяться первым.

Вас заинтересует / Intresting for you:

Встроенные методы коллекций PL… 4370 просмотров sepia Tue, 29 Oct 2019, 09:54:01

Управление приложениями PL/SQL… 2157 просмотров Rasen Fasenger Thu, 16 Jul 2020, 06:20:48

Тип данных RAW в PL/SQL 3549 просмотров Doctor Thu, 12 Jul 2018, 08:41:33

Символьные функции и аргументы… 7348 просмотров Анатолий Wed, 23 May 2018, 18:54:01

Author: Ирина Светлова

Другие статьи автора:

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

Поиск на других ресурсах:

1. Какая общая форма конструкции if-else-if?

Общая форма оператора if-else-if имеет вид:

if (условие1)
    оператор1;
else
if (условие2)
    оператор2;
else
...
if (условиеN)
    операторN;
else
    оператор;

где

  • условие1, условие2, …, условиеN – условное выражение, содержащее операции отношения;
  • оператор, оператор1, оператор2, операторN – один или несколько операторов.

Конструкция if-else-if работает следующим образом. Если выполняется условие1, то выполняется оператор1. Если условие1 не выполняется, то происходит переход к проверке условия2. Далее так же, если выполняется условие2, то выполняется оператор2. В противном случае происходит переход к следующему условию. Если в процессе проверки не выполнится ни одно условие, тогда выполняется последний оператор.

Если после выполнения условия нужно выполнить несколько операторов, то они обрамляются блоком { }.

2. Какой управляющий оператор заменяется конструкцией if-else-if?

Конструкция вида if-else-if может заменять оператор выбора switch.

Например, фрагмент кода, который определяет выходной день или рабочий, можно реализовать с помощью оператора switch и конструкции вида if-else-if.

Решение с помощью оператора switch:

int day;
boolean f_DayOff;

day = 7;
f_DayOff = false;

// реализация с оператором switch
switch (day)
{
    case 1: f_DayOff = false; break;
    case 2: f_DayOff = false; break;
    case 3: f_DayOff = false; break;
    case 4: f_DayOff = false; break;
    case 5: f_DayOff = false; break;
    case 6: f_DayOff = true; break;
    case 7: f_DayOff = true; break;
}

Решение задачи с использованием оператора if-else-if

int day;
boolean f_DayOff;

// ...
f_DayOff = false;

// конструкция if-else-if
if (day==1) f_DayOff = false;
else
if (day==2) f_DayOff = false;
else
if (day==3) f_DayOff = false;
else
if (day==4) f_DayOff = false;
else
if (day==5) f_DayOff = false;
else
if (day==6) f_DayOff = true;
else
if (day==7) f_DayOff = true;
3. Примеры использования конструкции if-else-if

Пример 1. Разработать программу вывода названия месяца, если он задан целым числом от 1 до 12. В программе использовать оператор if-else-if.

Фрагмент кода, решающий данную задачу:

int month; // номер месяца
String MONTH = ""; // название месяца

// ввод month
// ...

if (month==1) MONTH = "January";
else
if (month==2) MONTH = "February";
else
if (month==3) MONTH = "March";
else
if (month==4) MONTH = "April";
else
if (month==5) MONTH = "May";
else
if (month==6) MONTH = "June";
else
if (month==7) MONTH = "July";
else
if (month==8) MONTH = "August";
else
if (month==9) MONTH = "September";
else
if (month==10) MONTH = "October";
else
if (month==11) MONTH = "November";
else
if (month==12) MONTH = "December";

System.out.println(MONTH);

Пример 2. Разработать программу определения числа дней в месяце, если он задан номером от 1 до 12.

Фрагмент кода, решающий данную задачу

int month;
int n_days;

// ввод month
// ...

if ((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10))
    n_days = 31;
else
if (month==2)
    n_days = 28;
else
    n_days = 30;

Пример 3. Дано целое число n (1 ≤ n ≤ 4) и вещественное число x. По данному значению переменной n, которое есть номером функции, определить:

  • 1) cos x;
  • 2) tg x;
  • 3) sin x;
  • 4) ctg x.

Фрагмент кода, решающий данную задачу:

int n;
double f,x;

// ввод x, n
// ...

if (n==1) f = Math.cos(x);
else
if (n==2) f = Math.tan(x);
else
if (n==3) f = Math.sin(x);
else
    f = Math.cos(x)/Math.sin(x);
  • Оператор условного перехода if
  • Оператор выбора switch

The else if Statement

Use the statement to specify a new condition if the first condition is false.

Syntax

if (condition1) {   //  block of code to be executed if condition1 is true} else if (condition2) {   //  block of code to be executed if the condition1 is false and condition2 is true } else {   //  block of code to be executed if the condition1 is false and condition2 is false}

Example

If time is less than 10:00, create a «Good morning» greeting, if not, but time is less than 20:00, create a «Good day» greeting, otherwise a «Good evening»:

if (time < 10) {   greeting = «Good morning»; } else if (time < 20) {   greeting = «Good day»; } else {   greeting = «Good evening»; }

The result of greeting will be:

C++ Tutorial

C++ HOMEC++ IntroC++ Get StartedC++ SyntaxC++ Output Print Text New Lines

C++ CommentsC++ Variables Declare Variables Declare Multiple Variables Identifiers Constants

C++ User InputC++ Data Types Basic Data Types Numbers Booleans Characters Strings

C++ Operators Arithmetic Assignment Comparison Logical

C++ Strings Strings Concatenation Numbers and Strings String Length Access Strings User Input Strings Omitting Namespace

C++ MathC++ Booleans Boolean Values Boolean Expressions

C++ Conditions if else else if Short hand if..else

C++ SwitchC++ While Loop While Loop Do/While Loop

C++ For LoopC++ Break/ContinueC++ Arrays Arrays Arrays and Loops Omit Array Size

C++ References Create References Memory Address

C++ Pointers Create Pointers Dereferencing Modify Pointers

Вложенные операторы if

Вложенные операторы if позволяют добавить в код второстепенные условия, которые будут проверены, если первичное выражение истинно. То есть, таким образом вы можете поместить одно выражение if-else внутри другого выражения if-else. Синтаксис имеет такой вид:

Программа может вернуть такие результаты:

Если выражение statement1 истинно, программа оценит выражение nested_statement как истинное или ложное. Если вложенное выражение также истинно, она вернёт:

Если statement1 истинно, а nested_statement ложно, программа выведет на экран:

Если выражение statement1 ложно, программа не будет оценивать вложенные выражения и выведет:

В код можно добавить неограниченное количество вложенных операторов: э

Рассмотрим вложенные операторы на примере программы grade.py. К примеру, сначала программа может убедиться, что результаты теста можно засчитать (для этого нужно выполнить правильно минимум 65% заданий), а затем уже выставить оценки. Таким образом, если тест провален, программа не будет сверять значение переменной со всеми выражениями, а сразу выведет Failing grade.

К примеру, если значение переменной grade – 92, то первое условие выполнено,  и программа вернёт:

Затем она сравнит значение переменной с остальными выражениями. Поскольку в данном случае значение соответствует первому условию (grade >= 90), программа выведет:

Попробуйте установить переменной grade значение 60 и посмотрите, как поведёт себя программа. В этом случае первичное выражение if ложно, потому она сразу перейдёт к первичному оператору else и выведет:

Вы можете добавить в программу больше параметров, например, разделить оценки на А+, А, А- и так далее. Такой код будет выглядеть так:

Если переменная grade имеет значение 96, то:

  • Программа убедится, что значение переменной больше или равно 65 (в данном случае это условие выполняется).
  • Выведет на экран Passing grade of:.
  • Затем она сравнит значение с условием grade >= 90 (в данном случае оно истинно).
  • Программа проверит условие grade > 96 (ложно).
  • После этого она убедится, что значение больше 93 и меньше или равно 96 (истинно).
  • Программа выведет А.

Вывод команды будет выглядеть так:

Вложенные операторы if позволяют создать несколько дополнительных уровней кода и расширить его функции.

Основные использования ветвлений if/else

Ветвления if/else активно используются для проверки ошибок. Например, чтобы вычислить квадратный корень значения, параметр, который передается в функцию для вычисления, — обязательно должен быть положительным:

#include <iostream> #include <cmath> // для функции sqrt() void printSqrt(double value) { if (value >= 0.0) std::cout << «The square root of » << value << » is » << sqrt(value) << «\n»; else std::cout << «Error: » << value << » is negative\n»; }

1 2 3 4 5 6 7 8 9 10

#include <iostream> #include <cmath> // для функции sqrt()

voidprintSqrt(doublevalue)

{

if(value>=0.0)

std::cout<<«The square root of «<<value<<» is «<<sqrt(value)<<«\n»;

else

std::cout<<«Error: «<<value<<» is negative\n»;

}

Также операторы if используют для ранних возвратов — когда функция возвращает управление обратно в caller еще до завершения выполнения самой функции. В программе, приведенной ниже, если значением параметра является отрицательное число, то функция сразу же возвращает в caller символьную константу или перечислитель в качестве кода ошибки:

#include <iostream> enum class ErrorCode { ERROR_SUCCESS = 0, ERROR_NEGATIVE_NUMBER = -1 }; ErrorCode doSomething(int value) { // Если параметром value является отрицательное число, if (value < 0) // то сразу же возвращаем код ошибки return ErrorCode::ERROR_NEGATIVE_NUMBER; // Что-нибудь делаем return ErrorCode::ERROR_SUCCESS; } int main() { std::cout << «Enter a positive number: «; int a; std::cin >> a; if (doSomething(a) == ErrorCode::ERROR_NEGATIVE_NUMBER) { std::cout << «You entered a negative number!\n»; } else { std::cout << «It worked!\n»; } return 0; }

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37

#include <iostream>

enumclassErrorCode

{

ERROR_SUCCESS=,

ERROR_NEGATIVE_NUMBER=-1

};

ErrorCode doSomething(intvalue)

{

// Если параметром value является отрицательное число,

if(value<)

// то сразу же возвращаем код ошибки

returnErrorCode::ERROR_NEGATIVE_NUMBER;

// Что-нибудь делаем

returnErrorCode::ERROR_SUCCESS;

}

intmain()

{

std::cout<<«Enter a positive number: «;

inta;

std::cin>>a;

if(doSomething(a)==ErrorCode::ERROR_NEGATIVE_NUMBER)

{

std::cout<<«You entered a negative number!\n»;

}

else

{

std::cout<<«It worked!\n»;

}

return;

}

Ветвления if/else также обычно используют для выполнения простых математических операций. Например, рассмотрим функцию min(), которая возвращает минимальное из 2-х чисел:

int min(int a, int b) { if (a > b) return b; else return a; }

1 2 3 4 5 6 7

intmin(inta,intb)

{

if(a>b)

returnb;

else

returna;

}

Эта функция настолько проста, что её можно записать с помощью :

int min(int a, int b) { return (a > b) ? b : a; }

1 2 3 4

intmin(inta,intb)

{

return(a>b)?ba;

}

Возврат в вызывающую функцию

По окончании выполнения вызываемой функции осуществляется возврат значения в точку ее вызова. Это значение присваивается переменной, тип которой должен соответствовать типу возвращаемого значения функции. Функция может передать в вызывающую программу только одно значение. Для передачи возвращаемого значения в вызывающую функцию используется оператор return в одной из форм:

return(ВозвращаемоеЗначение);

return ВозвращаемоеЗначение;

returnreturnvoidreturn

return;

Пример

123456789101112131415161718

#define _CRT_SECURE_NO_WARNINGS // для возможности использования scanf#include <stdio.h>// Функция вычисления суммы двух чиселint sum(int x, int y) // в функцию передаются два целых числа{  int k = x + y;  // вычисляем сумму чисел и сохраняем в k  return k;       // возвращаем значение k}int main(){  int a, r;      // описание двух целых переменных  printf(«a= «);  scanf(«%d», &a); // вводим a  r = sum(a, 5);    // вызов функции: x=a, y=5  printf(«%d + 5 = %d», a, r); // вывод: a + 5 = r  getchar(); getchar(); // мы использовали scanf(),  return 0;  // поэтому getchar() вызываем дважжы}

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

  • тип возвращаемого значения;
  • имя функции;
  • типы формальных аргументов в порядке их следования.

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

12345678910111213141516171819

#define _CRT_SECURE_NO_WARNINGS // для возможности использования scanf#include <stdio.h>int sum(int, int);   // сигнатураint main(){  int a, r;  printf(«a= «);  scanf(«%d», &a);  r = sum(a, 5);    // вызов функции: x=a, y=5  printf(«%d + 5 = %d», a, r);  getchar(); getchar();  return 0;}int sum(int x, int y) // семантика{  int k;  k = x + y;  return(k);}


С этим читают