Нижегородский государственный университет им. Н.И.Лобачевского
Опубликован: 25.11.2008 | Доступ: свободный | Студентов: 9602 / 1297 | Оценка: 4.06 / 3.66 | Длительность: 21:16:00
Лекция 6:

Основные синтаксические конструкции языка C

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

5.3. Оператор присваивания

Оператор присваивания является наиболее распространенным средством, позволяющим изменить значение переменной во время работы программы.

В простейшем случае он имеет следующий формат:

namev = expression;

Здесь

  • namev – имя переменной:
  • expression – выражение, значение которого будет присвоено переменной namev.

Если переменная namev относится к категории числовых данных, то результат вычисления выражения тоже должен быть числовым. Типы переменной namev и значения выражения expression при этом могут не совпадать. О соответствующем преобразовании машинных форматов система позаботится сама. Но не забывайте, что при преобразовании вещественного значения в целочисленное дробная часть выражения (какой бы она ни была) будет отброшена. Таким образом, об округлении вы должны позаботиться сами. В тех случаях, когда тип выражения допускает более широкий диапазон представления данных, возможна потеря точности или переполнение диапазона, предусмотренного для переменной namev. В таких случаях компилятор выдает сообщение о возможных последствиях, и на такие сообщения программист обязан обратить внимание.

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

v1=v2=v3=exp;

Используя такую форму множественного присвоения, не пытайтесь писать операторы, результат выполнения которых может по разному толковаться разными пользователями. Например:

i=5;
  i=a[i]=4;
  j=6;
  a[j]=j=2;

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

В программах на C, C++ очень часто встречаются специфические форматы записи операторов присваивания. В тех случаях, когда значение переменной должно быть увеличено или уменьшено на 1, используются следующие синтаксические конструкции:

x++;	// вместо x=x+1;
  ++x;	// вместо x=x+1;
  x--;	// вместо x=x-1;
  --x;	// вместо x=x-1;

В приведенных примерах размещение двойного знака сложения или вычитания роли не играет. Однако такая конструкция может входить в качестве операнда в арифметическое выражение (что встречается не очень часто) или выступать в роли индекса у элементов массива. Например:

y=a[i++];
  z=b[++j];

В первом случае переменной y будет присвоено значение a[i] со старым индексом, после чего индекс i будет увеличен на 1. Во втором случае сначала индекс j будет увеличен на 1, а потом значение b[j] с новым индексом будет участвовать в операции присвоения.

Еще одна форма оператора присваивания ведет свое происхождение от условного арифметического выражения, впервые появившегося в языке АЛГОЛ-60:

v = (a > b)? e1 : e2;

Выполняется такой оператор следующим образом. Проверяется условие, записанное в круглых скобках и, если оно удовлетворяется, то переменной v присваивается значение выражения e1. В противном случае в переменную v засылается значение выражения e2.

5.4. Специальные формы оператора присваивания

Следующая группа операторов присваивания обязана своим происхождением формату машинных команд в двухадресных машинах:

COD A1,A2

Здесь

  • COD – код машинной операции;
  • A1,A2 – адреса ячеек оперативной памяти и/или арифметических регистров.

Результат выполнения такой операции над содержимым A1 и A2 записывается по адресу A1 ( A1=A1\otimes A2 ). По аналогии с такой записью в языках C, C++ появилась следующая синтаксическая конструкция:

v \otimes = exp; 	//вместо v = v \otimes  exp;

Здесь символ \otimes обозначает один из следующих знаков двухместных операций:

+,-,*,/,%,<<,>>,&,|,^

Например:

x += 2;	//вместо x=x+2;
  z /= 1.5;	//вместо z=z/1.5;

Довольно экзотически выглядит оператор присваивания, в правой части которого через запятую задана последовательность некоторых действий. Например:

x=(y=sin(a+b),z=cos(a-b),max(y,z));

Действия в скобках выполняются слева направо, т.е. сначала будет вычислено значение sin(a+b), которое занесут в переменную y, затем будет вычислено значение переменной z. Окончательным результатом скобки, которое будет присвоено переменной x, станет вычисление значения функции max(y,z).

5.5. Условный оператор

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

if(условие) {S1; S2;...} [else {Q1;Q2;...}]

Если условие, указанное в круглых скобках истинно, то выполняется цепочка операторов S1, S2, .... В противном случае выполняется цепочка операторов Q1,Q2,.... Альтернативная ветвь вместе со служебным словом else может отсутствовать. И тогда речь идет о выполнении или обходе цепочки операторов S1,S2,....

Простейшие условия задаются в виде проверки соотношения двух однотипных выражений:

if(a>b) cout<<a; else cout<<b;
  if(x>=0) y=sqrt(x);

Напомним, что операции отношения в языках C, C++ обозначаются следующими символами и их комбинациями:

== равно != не равно > больше
>= больше или равно < меньше <= меньше или равно

Более сложные условия могут составляться из элементарных соотношений с помощью логических операций "ИЛИ" ( || ), "И" ( && ), "НЕ" ( !). Например, проверка принадлежности x диапазону [ a,b ] выглядит следующим образом:

if(a<=x && x<=b) ...

В качестве логического условия иногда можно встретить в круглых скобках обычное арифметическое выражение:

if(a)...

В языке C логические переменные отсутствуют. Вместо этого действует соглашение о том, что ложь эквивалентна нулевому значению числового выражения, а истина – не нулевому значению. Поэтому приведенная выше проверка эквивалентна соотношению:

if(a != 0)...
< Лекция 5 || Лекция 6: 1234 || Лекция 7 >
Alexey Ku
Alexey Ku

Попробуйте часть кода до слова main заменить на 

#include "stdafx.h" //1

#include <iostream> //2
#include <conio.h>

using namespace std; //3

Александр Талеев
Александр Талеев

#include <iostream.h>
#include <conio.h>
int main(void)
{
int a,b,max;
cout << "a=5";
cin >> a;
cout <<"b=3";
cin >> b;
if(a>b) max=a;
else max=b;
cout <<" max="<<max;
getch();
return 0;
}

при запуске в visual express выдает ошибки 

Ошибка    1    error C1083: Не удается открыть файл включение: iostream.h: No such file or directory    c:\users\саня\documents\visual studio 2012\projects\проект3\проект3\исходный код.cpp    1    1    Проект3

    2    IntelliSense: не удается открыть источник файл "iostream.h"    c:\Users\Саня\Documents\Visual Studio 2012\Projects\Проект3\Проект3\Исходный код.cpp    1    1    Проект3

    3    IntelliSense: идентификатор "cout" не определен    c:\Users\Саня\Documents\Visual Studio 2012\Projects\Проект3\Проект3\Исходный код.cpp    6    1    Проект3

    4    IntelliSense: идентификатор "cin" не определен    c:\Users\Саня\Documents\Visual Studio 2012\Projects\Проект3\Проект3\Исходный код.cpp    7    1    Проект3

при создании файла я выбрал пустой проект. Может нужно было выбрать консольное приложение?