Новосибирский Государственный Университет
Опубликован: 26.08.2005 | Доступ: свободный | Студентов: 17836 / 3020 | Оценка: 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 >
Максим Сикстус
Максим Сикстус

При выполнении кода из Лекции 11, стр.2 получается результат:

x ravno 16.
x ravno 4.
x ravno 16.
x ravno 14.
x ravno 100.
x ravno 36.

Связано ли это с утверждением, что : "Единственным исключением при замене является макроопределение, находящееся внутри двойных кавычек"?

Андрей Белоусов
Андрей Белоусов

Я изучаю лекцию 5 и в ней есть выражения:

char *pc;

pc = (char*)0777;

Я так понял что, char *pc это ссылка на переменную pc,

0777 это тип int восьмиричный. А что делает выражение:

 pc = (char*)0777;

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