我开始使用 termcaps,我看到了这种操作。
term.c_lflag &= ~(ICANON);
我知道&=是一个binary AND,我对它不太满意。
为什么不简单地使用=或制作 a #define,以及&= ~做什么?
假设ICANON是一个位掩码,即一个整数,其位设置为表示某个特征,该语句将确保这些位未设置在c_lflag.
这通常被称为“屏蔽”这些位。
该操作是按位与按位求逆(~按位求逆)。
因此,如果在操作之前的值为c_lflag3(二进制 11 2),并且ICANON值为 2(二进制 10 2),它将变为 1,因为它是按位与:与~2除位号之外的所有位都设置的值1(二进制 ...11101 2)。
它也可以写得更详细
term.c_lflag = term.c_lflag & ~ICANON;
ICANON不需要周围的括号。
您的行删除了ICANONfrom的位term.c_lflag:
假设项的长度为 4 位,如果 的值为ICANON4 (0100b),则 的值为~ICANON11 (1011b),因此:
term.c_lflag 1 1 1 0
AND ~ICANON 1 0 1 1
---------------------
1 0 1 0
==> 1010b,十进制的 10
term.c_lflag &= ~(ICANON);
等于
term.c_lflag = term.c_lflag & ~(ICANON);
& 和 ~ 运算符是两个不同的运算符。~ 不是运算符,它在其中将每个位与其逆进行转换。& 运算符是按位与运算符,它逐位比较操作数。