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. Программа, различавшая проходную и непроходную оценку, зависела от того факта, что условный оператор имеет правосторонний порядок. Опишите, как обрабатывался бы этот оператор, имей он левосторонний порядок.
4.8. Побитовые операторы
bitset
, представляющего коллекцию битов изменяемого размера.
Как обычно, если операнд — "малое целое число", его значение сначала преобразуется (раздел 4.11) в больший целочисленный тип. Операнды могут быть знаковыми или беззнаковыми.
Таблица 4.3. Побитовые операторы (левосторонний порядок)
Оператор | Действие | Применение |
---|---|---|
~ | Побитовое NOT | ~ |
<< | Сдвиг влево |
|
>> | Сдвиг вправо |
|
& | Побитовое AND |
|
^ | Побитовое XOR |
|
| | Побитовое OR |
|
Если операнд знаковый и имеет отрицательное значение, то способ обработки "знакового разряда" большинства битовых операций зависит от конкретной машины. Кроме того, результат сдвига влево, изменяющего знаковый разряд, непредсказуем.
Мы уже использовали перегруженные версии операторов >>
и <<
, которые библиотека IO определяет для ввода и вывода. Однако первоначальное значение этих операторов — побитовый сдвиг операндов. Они возвращают значение, являющееся копией (возможно преобразованной) левого операнда, биты которого сдвинуты. Правый операнд не должен быть отрицательным, и его значение должно быть меньше количества битов результата. В противном случае операция имеет неопределенный результат. Биты сдвигаются влево (<<
) или право (>>
), при этом вышедшие за пределы биты отбрасываются.
<<
) (left-shift operator) добавляет нулевые биты справа. Поведение >>
) (right-shift operator) зависит от типа левого операнда: если он беззнаковый, то оператор добавляет слева нулевые биты; если он знаковый, то результат зависит от конкретной реализации: слева вставляются либо копии знакового разряда, либо нули.