Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабы_по_проге_Берлин / Книги / учебное пособие ОАиП.pdf
Скачиваний:
49
Добавлен:
11.02.2015
Размер:
947 Кб
Скачать

+ -

слева направо

<< >>

слева направо

< <= > >=

слева направо

== !=

слева направо

&

слева направо

^

слева направо

|

слева направо

&&

слева направо

||

слева направо

?:

справа налево

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

слева направо

операндов в С(С++) (как и в ряде других языков) не фиксирован. Это означает, что если в выражении х=операнд1 + операнд2 значение операнда1 влияет на величину операнда2, то не обязательно значение операнда1 будет вычислено ранее операнда2.

Порядок вычисления аргументов функции также не определен и на разных компиляторах может давать несовпадающие результаты.

printf(“%d %d”,n++,n+i);

Во избежание этого эффекта до входа в функцию все операнды, влияющие друг на друга, должны быть вычислены.

n++;

printf(”%d %d”,n,n+i);

Преобразование типов

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

1)char и short преобразуется в int, float - в double (в С(С++) все действия с вещественными числами производятся с двойной точностью). В С(С++) наряду

смодификатором unsigned существует модификатор signed. Если он используется сам по

себе, то это равносильно signed int. Имеют место следующие преобразования:

char - int (со знаком),

unsigned char - int (старший байт всегда нулевой),

signed char - int (в знаковый разряд int передается знак из char), short - int (знаковый или беззнаковый),

float - double;

2)enum преобразуется в int;

3)если один из операндов имеет тип double (long, unsigned), то другие преобразуются к double (long, unsigned) соответственно, результат будет иметь

тип double (long, unsigned);

4) последовательность имен типов, упорядоченных от "высшего" типа к

"низшему", имеет следующий вид: double, float, long, int, short, и char.

Применение модификатора unsigned повышает ранг соответствующего типа данных со знаком.

"Повышение" типа обычно заканчивается успешно, в то время как "понижение" может закончиться не всегда успешно. Это связано с тем, что все число может не поместиться в элементе данных низшего типа.

#include<stdio.h> void main(void)

{ char c;

/* объявление cимвольной переменной */

int i;

/* объявление переменной целого типа */

float f;

/* объявление переменной вещественного типа */

f=i=c='C';

 

printf("c= %c, i= %d, f= %2.3f \n",c,i,f);

c=c+1;

/*преобразования выполнятся успешно, т. к. размер-*/

i=f+c;

/*ность памяти под переменными c, i, f достаточна*/

f=i/c;

/*для размещ. в них значений вычисленных выраж. */

printf("c= %c, i= %d, f= %f \n",c,i,f);

c=3.67e17; /*для числа 3.67e17 требуется > 1 байта (ошибка)*/ printf("c= %c \n",c);

}

В С(С++) при вычислении все величины типа float преобразуются в тип double, что уменьшает вероятность погрешности при округлении. Конечный результат преобразуется к типу float (если это требуется).

Операция приведения

Рассмотренные выше преобразования типов выполняются автоматически. Существует возможность точно указать тип данных, к которому необходимо привести (преобразовать) некоторое выражение (переменную). Это заключается в том, что перед приводимым к требуемому типу выражением ставится тип в круглых скобках: (тип) выражение. Например:

int i: i=(int)3.4e-2+(int)’A’;

Вообще говоря, при разработке программ желательно не смешивать типы, во многих языках это запрещено. Однако в некоторых случаях этого избежать нельзя или это упрощает программу. В С(С++) вся ответственность за подобные преобразования ложится на программиста.

Операция запятая

В С(С++) любое выражение с оператором присваивания, заключенное в скобки, имеет значение, равное присваиваемому. Например, выражение (i=j+k) будет иметь значение суммы j+k. Использование скобок позволяет расширить смысл указанного выражения далее простого суммирования и присваивания полученного значения переменной i. Значение суммы присваивается также