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

Задания раздела 4.7
4.21. Напишите программу, использующую условный оператор для поиска в векторе vector<int> элементов с нечетным значением и их удвоения.
4.22. Дополните программу, присваивающую переменной значение оценки (высокая, проходная, не проходная), еще одной оценки, минимально-проходной от 60 до 75 включительно. Напишите две версии: одна использует только условные операторы; вторая использует один или несколько операторов if. Как по вашему, какую версию проще понять и почему?
4.23. Следующее выражение не компилируется из-за приоритета операторов. Используя таблицу из раздела 4.12, объясните причину проблемы. Как её исправить?
string s="word";
string p1=s+s[s.size()-1]=='s' ? "" : "s";
4.24. Программа, различавшая проходную и непроходную оценку, зависела от того факта, что условный оператор имеет правосторонний порядок. Опишите, как обрабатывался бы этот оператор, имей он левосторонний порядок.
Читать далее «Условный оператор»

Операторы доступа к членам

Задания раздела 4.6
4.20. С учетом того, что iter имеет тип vector<string>::iterator, укажите, какие из следующих выражений допустимы, если таковые имеются. Объясните поведение допустимых выражений, и почему ошибочные не допустимы?
(a) *iter++;
(b) (*iter)++;
(c) *iter.empty
(d) iter->empty();
(e) ++*iter;
(f) iter++->empty();
Читать далее «Операторы доступа к членам»

Операторы инкремента и декремента

Задания раздела 4.5
4.17. Объясните различие между префиксным и постфиксным инкрементом.
4.18. Что будет, если цикл while, используемый для отображения элементов вектора, задействует префиксный оператор инкремента?
4.19. С учетом того, что ptr указывает на тип int, vec - вектор vector<int>, а ival имеет тип int, объясните поведение каждого из следующих выражений. Есть ли среди них правильные? Почему? Как их исправить?
(a) ptr!=0 && *ptr++
(b) ival++&&ival
(c) vec[ival++] <= vec[ival]
Читать далее «Операторы инкремента и декремента»

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

Задания раздела 4.4
4.13. Каковы значения переменных i и d после каждого присвоения?
int i; double d;
(a) d=i=3.5;
(b) i=d=3.5;
4.14. Объясните, что происходит в каждом из следующих операторов if?
if(42=i) //
if(i=42) //
4.15. Следующее присвоение недопустимо. Почему? Как исправить ситуацию?
double dval; int ival; int *pi;
dval=ival=pi=0;
4.16. Хотя ниже приведены вполне допустимые выражения, их поведение может оказаться не таким, как предполагалось. Почему? Перепишите выражения так, чтобы они стали более понятными.
(a) if(p=getptr()!=0)
(b) if(i=1024)
Читать далее «Операторы присвоения»

Логические операторы, операторы отношения

Задания раздела 4.3
4.8. Объясните, когда обрабатываются операнды операторов логического AND, логического OR и оператора равенства.
4.9. Объясните поведение следующего условия оператора if:
const char *cp="Hello World";
if (cp && *cp)
4.10. Напишите условие цикла while, который читал бы целые числа со стандартного устройства ввода, пока во вводе не встретится значение 42.
4.11. Напишите выражение, проверяющее четыре значения a, b, c и d и являющееся истинным, если значение a>b, которое больше c, которое больше d.
4.12. С учетом того, что i, j и k имеют тип int, объясните значение выражения i!=j<k.
Читать далее «Логические операторы, операторы отношения»

Порядок выполнения. Арифметические операторы.

Задания раздела 4.2
4.4. Расставьте скобки в следующем выражении так, чтобы продемонстрировать порядок его обработки. Проверьте свой ответ, откомпилировав и отобразив результат выражения без круглых скобок.
12/3*4+5*15+24%4/2
4.5. Определите результат следующих выражений:
(a) -30*3+21/5
(b) -30+3*21/5
(c) 30/3*21%5
(d) -30/3*21%4
4.6. Напишите выражение, чтобы определить, является ли значение типа int четным или нечетным.
4.7. Что значит переполнение? Представьте три выражения, приводящих к переполнению.
Читать далее «Порядок выполнения. Арифметические операторы.»

Основы. Приоритет и порядок (скобочное огораживание)

Задания раздела 4.1.2
4.1. Какое значение возвратит выражение 5+10*20/2?
4.2. Используя таблицу раздела 4.12, расставьте скобки в следующих выражениях, чтобы обозначить порядок группировки операндов:
(a) *vec.begin()
(b) *vec.begin()+1

Задания раздела 4.1.3
4.3.
Порядок вычисления большинства парных операторов оставляется неопределенным, чтобы предоставить компилятору возможность для оптимизации. Эта стратегия является компромиссом между созданием эффективного кода и потенциальными проблемами в использовании языка программистом. Полагаете этот компромисс приемлемым? Кто-то да, кто-то нет.
Читать далее «Основы. Приоритет и порядок (скобочное огораживание)»

Что же дальше?

Вот и кануло в лету некоторое время, а с ним и пара сотен страниц стандарта. Я чувствую как на моих голых безмозглых костях начал появляться пух. Но с лица выражение недопонимания и удивления пока что не сошло. В дальнейшем я не буду выписывать всю теорию, а только ту, которая необходима для выполнения задания и ранее не упоминалась. А так же, возможно, те куски, которые понять трудно таким как я.
Читать далее «Что же дальше?»

Многомерные массивы

Задания раздела 3.6
3.43. Напишите три разных версии программы для вывода элементов массива ia. Одна версия должна использовать для управления перебором серийный оператор for, а другие две - обычный цикл for, но в одном случае использовать индексирование, а в другом указатели. Во всех трех программах пишите типы явно, т.е. не используйте псевдонимы типов и спецификаторы auto или decltype для упрощения кода.
3.44. Перепишите программы из предыдущего упражнения, используя псевдоним для типа управляющих переменных цикла.
3.45. Перепишите программы снова, на сей раз используя спецификатор auto.
Читать далее «Многомерные массивы»

Массив для инициализации вектора

Задания раздела 3.5.5
3.41. Напишите программу, инициализирующую вектор значениями из массива целых чисел.
3.42. Напишите программу, копирующую вектор целых чисел в массив целых чисел.
Читать далее «Массив для инициализации вектора»