在第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代码只询问三个标志,而不关心其他标志。您的代码受所有标志的影响。