Программирование ветвлений

Оператор if

Полная форма оператора if следующая:

if ( выражение) { оператор 1; … оператор N; }

else { оператор 1; … оператор K; }

Следующий оператор;

Здесь if и else — ключевые слова, которые записываются только маленькими буквами. Выражение, которое записывается в круглых скобках, чаще всего в простейшем случае (но не обязательно) представляет собой логическое выражение со значением true или false, содержащее арифметические, логические операции, операции сравнения и некоторые другие. Перечень и приоритет операций приведён 3.2.

Выполняется оператор следующим образом. Если выражение истинно, то выполняется первая последовательность из N операторов, вторая пропускается и выполняется следующий оператор, записанный после if. Если выражение ложно, то первая последовательность пропускается, выполняется вторая группа операторов, а затем следующий оператор.

Фигурные скобки, влияющие на выполнение алгоритма, обязательны, если в последовательности более одного оператора, и необязательны, если оператор один. Так, если в примере 1 (§ 1) опустим фигурные скобки после else, то слово “sum: ” будет выводиться в любом случае, независимо от значения выражения. Если их не запишем в первой группе операторов, то это приведёт к синтаксической ошибке на этапе компиляции, так как else будет рассматриваться как самостоятельный оператор, не связанный с if. А такого оператора else нет, это составная часть оператора if. Выполняться программа не будет. В сложных алгоритмах не всегда очевидно, сколько операторов в первой и (или) второй ветви, один или более одного. В таком случае лучше записать фигурные скобки {}. Ошибки не будет, если они не нужны.

Сокращённая (неполная) форма if имеет следующий вид:

if ( выражение) { оператор 1; … оператор N; }

Следующий оператор;

В отличие от первой формы, отсутствует else и вторая последовательность операторов. Если выражение истинно, то последовательность из N операторов выполняется. В противном случае она пропускается и выполняется следующий после if оператор.

Аналогично решается вопрос с фигурными скобками и в этом случае.

Замечание (можно не читать, если не знакомы с языком Pascal). Сравним if с аналогичным оператором языка Pascal

  • Название оператора всегда записывается маленькими буквами.
  • Анализируемое после if выражение записывается обязательно в круглых скобках.
  • Отсутствует ключевое слово then.
  • Фигурные скобки играют ту же роль, что ключевые слова begin и end.
  • Символ “;” (точка с запятой) перед else обязателен.

Определённые затруднения вызывает вложенность операторов if, когда среди операторов первой и (или) второй последовательности if есть другой, внутренний оператор if полной или сокращённой формы. Например:

if (a0) if (b0) cout

else cout

Для правильной интерпретации такой конструкции необходимо использовать следующее правило: else соответствует ближайшему предшествующему оператору if, ещё не имеющему else. В примере else связан с if (b0). Поэтому вывод Yes или No в зависимости от b будет выполняться только в случае, если a0. Если значение a неположительное, ничего выводиться не будет. Поэтому для наглядности желательно располагать ключевые слова так, чтобы это соответствовало логике программы, несмотря на то, что расположение операторов не влияет на их выполнение.

Чтобы else соответствовал внешнему оператору ветвления if (a0), необходимо добавить фигурные скобки следующим образом:

if (a0) { if (b0) cout

else cout

Этот пример показывает, что иногда на выполнение программы влияют фигурные скобки и в случае, если внутри их один оператор. Здесь имеет место полная форма внешнего оператора if и сокращённая форма внутреннего, а не наоборот, как было в первом случае.

Уровень вложенности операторов if может быть больше, чем показано выше. Часто на практике используется следующая конструкция if…else…if :

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

1-я последовательность операторов;

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

2-я последовательность операторов; …

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

n-я последовательность операторов;

else

(n+1)-я последовательность операторов;

Выражения вычисляются сверху вниз. Если будет найдено, что k-е выражение истинно, то выполняется k-я последовательность операторов, а остальные последовательности пропускаются. Если не найдено ни одного истинного выражения, то выполняется (n+1)-я последовательность операторов при условии, что последний else присутствует, или не выполняется никаких действий, если (n+1)-я последовательность вместе с последним оператором else отсутствует. Пример такой конструкции, которую иногда называют “лесенка if-else-if”, приведён дальше при описании оператора switch.

Могут быть и другие конструкции вложенных операторов if, например:

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

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

1-я последовательность операторов;

еlse 2-я последовательность операторов;

else 3-я последовательность операторов;

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

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

Пример 2. Допустима следующая запись: int a=5;

/* При объявлении инициализируем переменную, т.е. присваиваем ей начальное значение */

if (a) cout

/* Этот оператор if в стиле языка Pascal можно записать проще, используя операцию сравнения “не равно”: */

if (a!=0) cout

// или

if (a == 0) /* Операция сравнения на равенство — два символа “ равно” без пробела между ними */

cout

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

Пример 3. Пусть int x=5, y=2; Сравним два выражения в операторе if:

/*1*/ if (x = = y) cout

/*2*/ if (x=y) cout

В первом варианте значения двух переменных проверяются на равенство, и в результате будет выведено слово No. Второй вариант в стиле языка Pascal равносилен следующей последовательности:

x=y; // х примет значение y, то есть 2

if (x!=0) cout

// или в стиле языка С

if (x) cout

Поэтому в результате будет выведено слово Yes. Во втором варианте результат зависит только от начального значения y и не зависит от x.

Pascal. Операторы ветвления

Похожие статьи:

Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:

Adblock
detector