Вы можете объявить скалярный объект, используя инициализатор в скобках или скобках.
В этом объявлении
int ix((dx > 0) - (dx < 0));
в качестве инициализатора используется выражение (dx > 0) - (dx < 0)
.
если dx
больше 0, тогда подвыражение (dx > 0)
оценивается как логическое значение true, тогда как это подвыражение (dx < 0)
- как логическое значение false
. В результате выражение равно true - false
, где логические значения неявно преобразуются в 1 для истины и в 0 для ложных. Таким образом, вы получите 1, если dx
больше 0
.
Если dx
меньше 0
, вы получите -1
.
Если dx
равно 0
, оба подвыражения оцениваются как ложные, и вы получите 0
.
Таким образом, переменная ix инициализируется либо 1, либо 0, либо -1 в зависимости от того, больше dx
равно или меньше 0.
В этом объявлении
int error(dy - (dx >> 1));
используется оператор правого побитового сдвига dx >> 1
, который сдвигает биты переменной dx
на одну позицию вправо. Это эквивалентно выражению dx / 2
.
Например, если dx
равно 6, то его двоичное представление (для простоты я буду использовать только один байт)
0000 0110
сдвинув вправо на одну позицию, вы получите
0000 0011
, что является двоичным представлением 3.
Трудно сказать, почему этот инициализатор используется в этом объявлении
int error(dy - (dx >> 1));
, не зная контекста, где он используется.