永远不要尝试使用按位运算符和指针玩游戏。
如果您只是在寻找一种更简洁的方式来编写表达式,这是一种非常常见且惯用的方式:
FILE* from = fopen("in.txt", "r");
FILE* to = fopen("out.txt", "w");
if (!from || !to) // note the use of the ! operator
{
printf("failed to open files!\n");
return;
}
...
} /* end of function */
!运算符是逻辑 NOT 运算符。由于空指针的值始终为 0,这是一个“假”值,该表达式的!from意思是“如果from是空指针,则为真,否则为假”。它读起来也很好:“如果不是来自,或者不是到,那么处理错误”
同样,人们编写代码喜欢if (from)检查指针是否为非 NULL。
PS 我知道很多人喜欢FILE*在声明指针时使用表达式,但我不喜欢这种形式,因为它是谎言。当您声明FILE *from这意味着“表达式*from具有类型FILE”。将*右边放在 the 之后是可行的,FILE但这使它看起来意味着“表达式from具有指向指针的类型FILE”。它没有,这里有一个例子:
FILE* from, to;
from类型为“pointer-to- FILE”。什么类型to?为什么它很旧FILE,而不是任何类型的指针。如果您在一行上声明这些,您需要使用的表达式是:
FILE *from, *to;
这意味着“表达式*from是 type FILE,而表达式*to是 type FILE”。它看起来像,一旦你习惯了。
你可以写这个,但它很恶心。
FILE* from, *to;
呸!