永远不要尝试使用按位运算符和指针玩游戏。
如果您只是在寻找一种更简洁的方式来编写表达式,这是一种非常常见且惯用的方式:
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;
呸!