我在用C语言写一个uni家庭作业,我得到了一个已经完成的程序来调试它,我已经遍历了这行代码

int main() {
FILE *personFile;

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

personFile && fclose(personFile);     //??
return 0;
}

而不是
if (personFile != NULL)
    fclose(personFile);

我认为fclose(personFile)
如果由于C快速计算“条件”并跳过&&中的第二个参数而导致personFile为空,则永远不会发生,如果第一个参数为false,但我不确定
真的是这样吗这种“欺骗”的方式是一种不好的做法,还是我很幸运从未见过这样的事情?

最佳答案

由于运算符&&使用短路求值(如果左操作数为false/0,则表达式不可能为true,因此不要费心求值右操作数),这只是在对其调用NULL之前检查文件指针是否为非-fclose
||运算符还使用短路求值,其中,如果左操作数的求值结果为非零,则无论右操作数是什么,整个表达式都绝对为真,因此不会求值。
真的是这样吗这种“欺骗”的方式是一种不好的做法,还是我很幸运从未见过这样的事情?
有很多“聪明的技巧”实际上是惯用的C语言,在代码审查期间不会引起注意;据我所知,这不是其中之一。

09-25 21:36