Расширение оператора if
Оператор if
Подсчитаем число строк в файле. Это можно сделать путем счета числа символов "новая строка" в файле.
Пример:
/*подсчет строк */
#include <stdio.h>
main( )
{
int ch;
int line_count=0;
while((ch = getchar( )) != EOF)
if(ch == '\n') line_count++;
printf("Мы насчитали %d строк. \n", line_count);
}
Оператор if служит указанием компьютеру увеличить значение переменной line_count на 1, если только что прочитанный символ, содержимое переменной ch, представляет собой символ "новая строка". Что происходит в случае, когда значение переменной ch не является символом "новая строка"? Тогда в цикле while производится чтение следующего символа. Оператор if считается одиночным оператором, начинающимся от ключевого слова if и завершающимся символом "точка с запятой". Модифицируем программу. Подсчитаем одновременно число символов и строк в файле:
/* подсчет числа строк и символов */
#include <stdio.h>
main( )
{
int ch = 0;
int line_count = 0;
int char_count = 0;
while((ch = getchar( )) != EOF) {
char_count++;
if(ch == '\n')
line_count++;
}
printf("Мы насчитали %d символов и %d строк.\n",
char_count, line_count);
}
Теперь в цикл while входят два оператора, поэтому мы использовали фигурные скобки, чтобы отметить начало и конец цикла.
Простейшей формой оператора if является
if(выражение)
оператор
Под выражением здесь понимаем условное выражение. С его помощью сравниваются значения двух величин. Если такое выражение истинно, то оператор выполняется. В противном случае он пропускается. В общем случае в качестве условия может быть использовано любое выражение, и если его значение равно 0, то оно считается ложным.
Оператор может быть простым или составным, т. е. блоком.
Пример:
/* пример одиночного оператора и блока */
#include <stdio.h>
main( )
{
int i;
i=getchar( );
if(i > 5)
/* одиночный оператор*/
printf("Значение больше 5.\n");
if(i < 5) {
/* составной оператор*/
printf("Значение\n");
printf(" меньше 5.\n");
}
}
Простая форма оператора if позволяет выбрать оператор, возможно, составной, или пропустить его. Язык Си предоставляет также возможность выбрать любой из двух операторов путем использования конструкции if-else.
Напишем программу, заменяющую каждый символ из таблицы ASCII на следующий символ, кроме символа "новая строка".
Пример:
/* код_1*/
#include <stdio.h>
main( )
{
char ch;
while ((ch=getch( )) != EOF) {
/* оставить символ "новая строка неизменным" */
if (ch == '\n') putchar(ch);
else
/* заменить остальные символы*/
putchar(ch + 1);
}
}
Общий вид оператора if-else выглядит следующим образом:
if(выражение)
оператор
else
оператор
Если выражение истинно, то выполняется первый оператор, а если ложно, то выполняется оператор, следующий за ключевым словом else. Операторы могут быть простыми или составными.
! | Правила языка Си не требуют отступа в строке, но это стало обычной практикой. Отступ позволяет с первого взгляда заметить те операторы, выполнение которых зависит от проверяемого условия. |
Простая конструкция 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;