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

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

< Лекция 6 || Лекция 7: 1234 || Лекция 8 >

Что такое истина

Мы ответим на этот вопрос, как он решается в языке Си. В Си выражение всегда имеет значение. Это утверждение остается верным даже для условных выражений, как показывает пример, приведенный ниже. В нем определяются значения двух условных выражений, одно из которых оказывается истинным, а второе - ложным:

/* истина и ложь*/
main( )
{
  int true, false;
  true = (12 > 2); /*отношение истинно*/
  false = (12 == 2) ; /*отношение ложно*/
  printf("true = %d; false = %d\n",true,false);
}

При выполнении программы получим следующие результаты:

true = 1, false = 0.

В языке Си значение истина равно 1, а значение ложь равно 0. В языке Си все ненулевые значения являются истинными, и только 0 являются ложью. Например, два оператора

if(i !=0 )

можно заменить на

if(i)

поскольку выражение (i !=0 ) и выражение (i) оба примут значения 0, или ложь, только в том случае, если значение переменной i равно 0.

Осложнение с понятием истина

Рассмотрим следующую программу:

/* занятость */
#include <stdio.h>
main( )
{
  int age =20;
  while (age++ <= 63)   {
    /* делится ли возраст на 20*/
    if((age % 20) == 0) 
    printf(" Вам %d.\n", age);
    if(age = 63)
    printf("Вам уже %d.\n",age);
  }
}

Мы хотели написать программу, чтобы результат работы программы выглядел так:

Вам 40.
Вам 60.
Вам уже 63.

На самом деле выход будет таким:

Вам уже 63.
Вам уже 63.
Вам уже 63.

и т. д. - до бесконечности. Это произошло, потому что мы ошибочно написали

if(age = 63)

вместо

if(age == 63)

В операторе

if(age = 63)

переменной age присваивается значение 63, т. е. результат этого оператора - истина и выполняется оператор

printf("Вам %d.\n",age);

В операторе

while(age++ <= 63)

условие выполняется, и программа зацикливается.

Приоритеты операций отношения мы описали в лекции 3.

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

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

/* число символов */
main( )
{
  int ch;
  int count=0;
  while((ch=getchar( )) != EOF)
    if(ch !=' ' && ch != '\n' && ch != '\t')
  count++;
  printf("Всего %d непустых символов. \n", count);
}

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

Операция Смысл
&& И
|| ИЛИ
! НЕ

Если прочитанный символ - не пробел и не символ "новая строка", и не символ табуляции, то происходит увеличение значения переменной count на единицу. Все выражение будет истинным, если указанные три условия - истинны . В языке Си имеются три логические операции.

< Лекция 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.

Александр Серый-Казак
Александр Серый-Казак
Россия
Максим Виноградов
Максим Виноградов
Россия, Москва