|
Программирование >> Инициализация объектов класса, структура
4 * ( 5 + 7 * 2 ) ==> 7 6 4 * ( (5 + 7) * 2 ) ==> 96 Вот как с помощью скобок исправить поведение предыдущего примера: while ( (ch = nextChar()) != \n ) Операторы обладают и приоритетом, и ассоциативностью. Оператор присваивания правоассоциативен, поэтому вычисляется справа налево: ival = jval = kva1 = lval Сначала kval получает значение lval, затем jval - значение результата этого присваивания, и в конце концов ival получает значение jval. Арифметические операции, наоборот, левоассоциативны. Следовательно, в выражении ival + jval + kva1 + 1va1 сначала складываются ival и jval, потом к результату прибавляется kval, а затем и lval. В таблице 4.4 приведен полный список операторов С++ в порядке уменьшения их приоритета. Операторы внутри одной секции таблицы имеют равные приоритеты. Все операторы некоторой секции имеют более высокий приоритет, чем операторы из секций, следующих за ней. Так, операции умножения и деления имеют одинаковый приоритет, и он выше приоритета любой из операций сравнения. Упражнение 4.18 (a) ! ptr == ptr->next (b) ~ uc 0377 & ui << 4 Каков порядок вычисления следующих выражений? При ответе используйте таблицу 4.4. i (c) ch = buf[ bp++ ] != \n Упражнение 4.19 Следующая конструкция ведет себя не так, как можно было бы ожидать. Приоритет операции присваивания меньше, чем операции сравнения: while ( ch = nextChar() != \n ) Программист хотел присвоить переменной ch значение, а затем проверить, равно ли оно символу новой строки. Однако на самом деле выражение сначала сравнивает значение, полученное от nextChar(), с \n, и результат - true или false - присваивает переменной ch. Приоритеты операций можно изменить с помощью скобок. Выражения в скобках вычисляются в первую очередь. Например: Все три выражения из предыдущего упражнения вычисляются не в той последовательности, какую, по-видимому, хотел задать программист. Расставьте скобки так, чтобы реализовать его первоначальный замысел. Упражнение 4.20 Следующие выражения вызывают ошибку компиляции из-за неправильно понятого (a) int i doSomething(), 0; приоритета операций. Объясните, как их исправить, используя таблицу 4.4. i (b) cout << ival % 2 ? odd : even ; Таблица 4.4. Приоритеты операций
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |