8.5 K&R书中的代码更简单,只有逻辑运算符而不是位运算符和逻辑运算符

时间:2019-07-22 18:43:22

标签: c

在8.5节中,在fopen示例中,K&R写道:

if ((fp->flag & (_READ | _EOF | _ERR )) != _READ)

但是我觉得这更容易:

if (fp->flag != _READ)

我的代码不好还是K&R很模糊... 谢谢

1 个答案:

答案 0 :(得分:2)

flag成员的位分配的含义不仅限于_READ01),_EOF010,八进制为八进制) ,和_ERR020,16)。还有_WRITE02)和_UNBUF04)。

只要且仅当清除(fp->flag & (_READ | _EOF | _ERR )) != _READ,设置_READ或设置_EOF时,Kernighan和Ritchie的代码_ERR才是正确的。

只有在fp->flag != _READ被清除,_READ被设置,_EOF被设置,_ERR被设置的情况下,您的代码_WRITE为真,或设置了_UNBUF

因此,例如,如果在设置_UNBUF的同时设置_READ,清除_EOF和清除_ERR,则Kernighan和Ritchie代码的计算结果为false,但是您的代码将评估为true。柯尼根(Kernighan)和里奇(Ritchie)代码仅询问三个标志,而不关心其他标志。您的代码受所有标志的影响。