在8.5节中,在fopen示例中,K&R写道:
if ((fp->flag & (_READ | _EOF | _ERR )) != _READ)
但是我觉得这更容易:
if (fp->flag != _READ)
我的代码不好还是K&R很模糊... 谢谢
答案 0 :(得分:2)
为flag
成员的位分配的含义不仅限于_READ
(01
),_EOF
(010
,八进制为八进制) ,和_ERR
(020
,16)。还有_WRITE
(02
)和_UNBUF
(04
)。
只要且仅当清除(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)代码仅询问三个标志,而不关心其他标志。您的代码受所有标志的影响。