我在用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语言,在代码审查期间不会引起注意;据我所知,这不是其中之一。