|
Программирование >> Инициализация объектов класса, структура
Внимание! это не сравнение 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 в обоих случаях. Это свойство операции присваивания
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |