Новосибирский Государственный Университет
Опубликован: 26.08.2005 | Доступ: свободный | Студентов: 17201 / 2757 | Оценка: 4.07 / 3.55 | Длительность: 13:11:00
ISBN: 978-5-9556-0057-4
Лекция 7:

Выбор вариантов

< Лекция 6 || Лекция 7: 1234 || Лекция 8 >
! Правила языка Си не требуют отступа в строке, но это стало обычной практикой. Отступ позволяет с первого взгляда заметить те операторы, выполнение которых зависит от проверяемого условия.

Простая конструкция if позволяет нам выбрать, выполнить или нет некоторое действие; конструкция же if-else дает возможность выбрать одно из двух действий.

Подведем итоги.

Оператор if имеет две формы:

if(выражение) оператор;

и

if(выражение)
  оператор1;
else
  оператор2;

Если в результате вычисления значения выражения получено значение " истина " (ненулевое значение), то в обеих формах оператора if выполняется оператор1. Если вычисленное значение выражения равно значению " ложь " (нулевое), тогда выполнение оператора if, представленного в первой форме, заканчивается, а в операторе, имеющем вторую форму, выполняется оператор 2.

Совместное использование обеих форм оператора if приводит к неоднозначности, называемой " проблемой висящего else ".

Например, вложенный оператор if

if(e1)   if( e2) оператор1; else оператор2;

может быть интерпретирован так

if (e1)
  if(e2)
    оператор1;
  else
    оператор2;

или так

if(e1)
  if(e2) оператор1;
else
  оператор2;

Эта неоднозначность разрешается в языке Си с помощью правила, в соответствии с которым часть else оператора всегда относится к синтаксически самому правому, игнорируя любые отступы, оператору if без части else. Следовательно, первая интерпретация является интерпретацией, принятой в языке Си.

! Существует простой способ, позволяющий избавиться от такой неоднозначности: следует избегать одновременного использования обеих форм операторов if в конструкциях с вложенными операторами if. При необходимости можно воспользоваться пустым оператором. Например, вторая интерпретация вышеприведенного оператора if может быть записана как
if(e1)
if(e2) оператор1;
else
; /* точка с запятой здесь обозначает пустой
оператор*/
else оператор2;

Для явного указания намерений программиста можно использовать и фигурные скобки. Например, обе вышеприведенные интерпретации можно записать явно так:

if(e1) {
  if(e2)
    оператор1;
  else
  оператор2
}

и

if(e1) {
  if(e2) оператор1;
}
else
  оператор2;

Операции отношения

Операции отношения используются для сравнений. Мы уже обсуждали их, но здесь мы остановимся на их обсуждении подробнее.

Операция смысл
< меньше
<= меньше или равно
== равно
>= больше или равно
> больше
!= не равно

Этот список хорошо соответствует возможным числовым соотношениям.

! Главное предостережение, которое мы хотим сделать, состоит в том, чтобы не использовать знак = вместо ==. С помощью операции присваивания некоторое значение присваивается переменной слева от знака равенства. В то же время с помощью операции отношения "равенство" проверяется: равно ли выражение, стоящее слева от знака, выражению справа от него. Эта операция не изменяет значения переменной в левой части, если она там присутствует. При программировании требуется аккуратность, потому что в ряде случаев компилятор не сможет обнаружить ошибки, связанные с неправильным использованием знаков этих отношений, что приведет к результатам, отличным от тех, которые вы должны были бы получить.

Операции отношения применяются при формировании условных выражений, используемых в операторах if и while. Указанные операторы проверяют, истинно или ложно данное выражение.

Пример:

#include <stdio.h>
main( ) 
{
  int mark;
  mark = getchar( );
  if(mark == '4')
    printf("Оценка 4.\n");
  else if (mark > '4')
    printf("Оценка больше 4!\n");
  else /* случай, когда оценка меньше 4 */
  {
    mark--;
    printf("Теперь оценка на 1 меньше.\n");
  }
}
< Лекция 6 || Лекция 7: 1234 || Лекция 8 >
Вадим Ратьков
Вадим Ратьков

Объясните, пожалуйста, чем отличаются два этих кода?

printf("смешанное деление: 7./4 это %2.2f \n", 7./4);

и

printf("смешанное деление: 7./4 это %f \n", 7./4);

%f  это, понятное дело, float. А что такое %2.2f ?

Вопрос возник при прочтении лекции 3 часть вторая курса Основы программирования на языке C.

http://www.intuit.ru/studies/courses/43/43/lecture/1281?page=2

Анна Алексанина
Анна Алексанина

Я хочу выполнить одну из программ, которые есть в лекции. Но для этого мне надо компилировать текст, а я не знаю, как это сделать. ОС Windows.

Александр Утробин
Александр Утробин
Россия, г. Набережные Челны
Алексей Образцов
Алексей Образцов
Россия, г. Санкт-Петербург