使用“&&”和“||” 在 C 中条件之外的语句中

Dar*_*rox 1 c boolean-logic operators conditional-statements

我正在用 C 做一个 uni 作业,我得到了一个已经完成的程序来调试它,我已经走过这行代码

int main() {
FILE *personFile;

//...
//some code
//..

personFile && fclose(personFile);     //??
return 0;
}
Run Code Online (Sandbox Code Playgroud)

代替

if (personFile != NULL) 
    fclose(personFile);
Run Code Online (Sandbox Code Playgroud)

我认为fclose(personFile) 如果personFile为 NULL则永远不会发生,因为 C 快速评估“条件”并跳过 && 中的第二个参数,如果第一个参数为假,但我不确定

这真的是它的工作原理吗?这种“欺骗”条件的方式是不好的做法还是我很幸运从未见过这样的事情?

Gov*_*mar 5

由于运算符&&使用短路求值(如果左操作数为 false/ 0,则表达式不可能为真,所以不要费心求值右操作数),这只是检查文件指针是否为非-NULL在调用fclose它之前。

||运算符还使用短路评估,如果左操作数的计算结果为非零,则无论右操作数是什么,整个表达式肯定为真,因此不会对其进行评估。

这真的是它的工作原理吗?这种“欺骗”条件的方式是不好的做法还是我很幸运从未见过这样的事情?

有很多“聪明的技巧”实际上是 C 语言惯用的,在代码审查期间不会引起人们的注意;据我所知,这不是其中之一。