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



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

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

但我认为这更容易:

if (fp->flag != _READ)

我的代码不好还是K&R简单晦涩难懂...谢谢

flag成员

的位被赋予了更多的含义,而不仅仅是_READ(01(、_EOF(010,8是八进制(和_ERR(020,16(。还有_WRITE(02(和_UNBUF(04(。

Kernighan和Ritchie的代码,(fp->flag & (_READ | _EOF | _ERR )) != _READ,当且仅当_READ是明确的,_EOF被设置,或者_ERR被设置。

您的代码 fp->flag != _READ 当且仅当_READ清晰、设置_EOF、设置_ERR、设置_WRITE或设置_UNBUF时,才为真。

因此,例如,如果在设置_READ时设置了_UNBUF,则_EOF是明确的,_ERR是明确的,则 Kernighan 和 Ritchie 代码的计算结果将为 false,但您的代码将计算为 true。Kernighan和Ritchie代码只询问三个标志,而不关心其他标志。您的代码受所有标志的影响。

最新更新