Программирование >>  Инициализация объектов класса, структура 

1 ... 45 46 47 [ 48 ] 49 50 51 ... 395


Внимание! это не сравнение 3 переменн друг с другом if ( ival != jva1 != kva1 )

jval и kval различаются. Где мы промахнулись?

do something ...

Значения 0, 1 и 0 дают в результате вычисления такого выражения true. Почему? Сначала проверяется ival != jval, а потом итог этой проверки (true/false -

if ( ival != jva1 && ival != kva1 && jva1 != kva1 )

преобразованной к 1/0) сравнивается с kval. Mi должны были явно написать:

сделать что-то .

Упражнение 4.4

Найдите неправильные или непереносимые выражения, поясните. Как их можно

(a) ptr->iva1 != 0 ( с) ptr != 0 && *pt

(e) vec[ iva1++ ] <= vec[ ival ];

изменить? (Заметим, что типы объектов не играют роли в данных примерах.)

(b) ival != jva1 < kva1 (d) iva1++ && ival

Упражнение 4.5

Язык С++ не диктует порядок вычисления операций сравнения для того, чтобы позволить компилятору делать это оптимальным образом. Как вы думаете, стоило бы в данном случае пожертвовать эффективностью, чтобы избежать ошибок, связанных с предположением о вычислении выражения слева направо?

4.4. Операции присваивания

int ival = 1024; Инициализация задает начальное значение переменной. Например:

int *pi = 0;

В результате операции присваивания объект получает новое значение, при этом старое

ival = 2048;

пропадает:

pi = &iva1;

Еще один пример возможной ошибки. Mi хотели убедиться, что все три величины ival,



int value = 1024;

Возможно, имелось в виду следующее:

value = ival; правильно

Однако недостаточно потребовать, чтобы операнд слева от знака присваивания был 1-

const int array size = 8;

int ia[ array size ] = { 0, 1, 2, 2, 3, 5, 8, 13 };

значением. Так, после определений

int *pia = ia;

выражение

array size = 512; ошибка

ошибочно, хотя array size и является 1-значением: объявление array size константой не дает возможности изменить его значение. Аналогично

ia = pia; ошибка ia - тоже 1-значение, но оно не может быть значением массива.

Иногда путают инициализацию и присваивание, так как они обозначаются одним и тем же знаком =. Объект инициализируется только один раз - при его определении. В то же время операция может быть применена к нему многократно.

Что происходит, если тип объекта не совпадает с типом значения, которое ему хотят присвоить? Допустим,

ival = 3.14159; правильно?

В таком случае компилятор пытается трансформировать тип объекта, стоящего справа, в тип объекта, стоящего слева. Если такое преобразование возможно, компилятор неявно изменяет тип, причем при потере точности обычно выдается предупреждение. В нашем случае вещественное значение 3.14159 преобразуется в целое значение 3, и это значение присваивается переменной ival.

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

pi = ival; ошибка

Неявная трансформация типа int в тип указатель на int невозможна. (Набор допустимых неявных преобразований типов мы обсудим в разделе 4.14.)

Левый операнд операции присваивания должен быть 1-значением. Очевидный пример неправильного присваивания:

1024 = ival; ошибка



extern char next char(); int main() {

char ch = next char(); while ( ch != \n ) {

сделать что-то ... ch = next char(); }

...

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

extern char next char(); int main() {

char ch;

while (( ch = next char() ) != \n ) {

сделать что-то ...

...

может быть переписан так:

Заметим, что вокруг выражения присваивания необходимы скобки, поскольку приоритет этой операции ниже, чем операции сравнения. Без скобок первым выполняется сравнение:

next char() != \n

Неверна и инструкция

pia + 2=1; ошибка

Хотя pia+2 дает адрес ia[2], присвоить ему значение нельзя. Если мы хотим изменить элемент ia[2], то нужно воспользоваться операцией разыменования. Корректной будет следующая запись:

*(pia + 2) = 1; правильно

Операция присваивания имеет результат - значение, которое было присвоено самому левому операнду. Например, результатом такой операции

ival = 0; является 0, а результат

ival = 3.14159;

равен 3. Тип результата - int в обоих случаях. Это свойство операции присваивания



1 ... 45 46 47 [ 48 ] 49 50 51 ... 395

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика