Всем привет. Изучая книгу Бьярне Страуструпа, я наткнулся на интересный, по моему мнению, пример:
class Tiny {
char v;
void assign(int i) {
if(i&~077) // #1
throw Bad_range();
v = i;
}
public:
class Bad_range{};
Tiny(int i) { assign(i); }
Tiny& operator = (int i) { assign(i); return *this; }
operator int() const { return v; }
};
int main () {
Tiny c1 = 2;
Tiny c2 = 1;
Tiny c3 = c1 - c2; // #2
}
Так вот, первый вопрос(# 1), что это за условие, так как я вижу его впервые.
И (# 2), выражение (c1 - c2) превратится в тип int или Tiny? И будет ли разница в производительности, если не учитывать второй вопрос?
077 - число в восьмеричной системе счисления, которое бинарно записывается как 00..00111111 - нули до размера int. Операция ~ обращает все биты, т.е. получается 11..11000000. Операция побитового И с таким числом даст true (ненулевое значение) при наличии в числе хотя бы одного единичного бита начиная с 6 (считая от нуля). Так что это проверка, что число от 0 до 63 включительно (как для беззнаковых, так и для знаковых чисел), вернее, что число вне этого диапазона - тогда генерируется исключение.
Во второй части c1 и c2 для разности будут приведены к типу int (оператор int()), и результат вычитания типа int будет использован для создания объекта c3 типа Tiny (конструктор Tiny(int)).
Сборка персонального компьютера от Artline: умный выбор для современных пользователей