> var.my_flag = 2;
> if(var.my_flag) {если ты проверяешь значение как if(x){ ... }, значит ты проверяешь его на "не ноль".
напр., if (ptr) { *ptr = VAL; } -- это указатель;
на ноль или NULL ты его проверяешь как if (!ptr) {...}.
таким образом проверяются только целочисленные значения и указатели.
значения с плавающей точкой никогда так не проверяются, потому что машинный ноль -- не ноль.
все действительные значения проверяются операторами сравнения.
всегда.
> var.my_flag = 2;
эта строка сразу выглядит ошибкой.
потому что название my_flag подразумевает ноль и не-ноль, причём не-ноль в сях обычно пишется 1.
другие ненулевые значения собьют с толку программистов, которые будут работать с кодом.
поэтому не-ноль -- это всегда 1.
если же ты присваиваешь значению 2, значит ты не считаешь значение булевым.
(и ты не считаешь его действительным. чтобы присвоить действительное значение, писать надо с десятичной точкой x = 2.0, x = 0.0 или x = .0).
если ты всё-таки хочешь использовать его как флаг, но при этом он обязательно должен уметь содержать разные ненулевые значения, то тебе следует оставить комментарий с пояснением в месте определения поля.
сишный стандарт -- он для людей, занимающихся разработкой системного или компактного ПО.
ты же стараешься изготовить некий newspeak (известный также как "новояз"), который лишит людей возможности делать ошибки и писать неправильные вещи, так что любой дурак сможет написать программу любой сложности.
все начинающие этим страдают.
поэтому правило: "создай систему, которой сможет пользоваться даже дурак, и только дурак захочет ею пользоваться" (с).
тебе надо заняться друими вещами, вроде того же раста, предназначенного не столько для программистов, сколько для кодеров, чья работа -- без особых раздумий кодировать алгоритмы, спускаемые сениорами сверху.