cout << grade < 60 ? "fail" : "pass"; //
Второе выражение использует сравнение grade
и 60
как операнд оператора <<
. В зависимости от истинности или ложности выражения grade < 60
выводится значение 1
или 0
. Оператор <<
возвращает объект cout
, который и проверяется в условии условного оператора. Таким образом, второе выражение эквивалентно следующему:
cout << (grade < 60); //
cout ? "fail" : "pass"; //
//
//
Последнее выражение ошибочно, поскольку оно эквивалентно следующему:
cout << grade; //
//
cout < 60 ? "fail" : "pass"; //
Упражнение 4.21. Напишите программу, использующую условный оператор для поиска в векторе vector
элементов с нечетным значением и их удвоения.
Упражнение 4.22. Дополните программу, присваивающую переменной значение оценки (высокая, проходная, не проходная), еще одной оценки, минимально проходной, от 60 до 75 включительно. Напишите две версии: одна использует только условные операторы; вторая использует один или несколько операторов if
. Как по вашему, какую версию проще понять и почему?
Упражнение 4.23. Следующее выражение не компилируется из-за приоритета операторов. Используя таблицу из раздела 4.12, объясните причину проблемы. Как ее исправить?
string s = "word";
string p1 = s + s[s.size() - 1] == 's' ? "" : "s" ;
Упражнение 4.24. Программа, различавшая проходную и непроходную оценку, зависела от того факта, что условный оператор имеет правосторонний порядок. Опишите, как обрабатывался бы этот оператор, имей он левосторонний порядок.
bitset
, представляющего коллекцию битов изменяемого размера.
Как обычно, если операнд — "малое целое число", его значение сначала преобразуется (раздел 4.11) в больший целочисленный тип. Операнды могут быть знаковыми или беззнаковыми.
Таблица 4.3. Побитовые операторы (левосторонний порядок)
Оператор | Действие | Применение |
---|---|---|
~ | Побитовое NOT | ~ |
<< | Сдвиг влево |
|
>> | Сдвиг вправо |
|
& | Побитовое AND |
|
^ | Побитовое XOR |
|
| | Побитовое OR |
|
Если операнд знаковый и имеет отрицательное значение, то способ обработки "знакового разряда" большинства битовых операций зависит от конкретной машины. Кроме того, результат сдвига влево, изменяющего знаковый разряд, непредсказуем.
Поскольку нет никаких гарантий однозначного выполнения побитовых операторов со знаковыми переменными на разных машинах, настоятельно рекомендуется использовать в них только беззнаковые целочисленные значения.
Мы уже использовали перегруженные версии операторов >>
и <<
, которые библиотека IO определяет для ввода и вывода. Однако первоначальное значение этих операторов — побитовый сдвиг операндов. Они возвращают значение, являющееся копией (возможно преобразованной) левого операнда, биты которого сдвинуты. Правый операнд не должен быть отрицательным, и его значение должно быть меньше количества битов результата. В противном случае операция имеет неопределенный результат. Биты сдвигаются влево (<<
) или право (>>
), при этом вышедшие за пределы биты отбрасываются.
<<
) (left-shift operator) добавляет нулевые биты справа. Поведение >>
) (right-shift operator) зависит от типа левого операнда: если он беззнаковый, то оператор добавляет слева нулевые биты; если он знаковый, то результат зависит от конкретной реализации: слева вставляются либо копии знакового разряда, либо нули.