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

Using '&&' and '||' in a statement outside of condition in C

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

int main() {
FILE *personFile;

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

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

而不是

if (personFile != NULL) 
    fclose(personFile);

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

真的是这样吗?这种 "cheating" 条件的方式是一种不好的做法,还是我很幸运从未见过这样的事情?

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

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

Is this really how it works? And is this way of "cheating" conditons a bad practice or am I just lucky to never have seen something like this?

有很多 "clever tricks" 实际上是惯用的 C,在代码审查期间不会引起注意;据我所知,这不是其中之一。

Is this really how it works?

And is this way of "cheating" conditons a bad practice or am I just lucky to never have seen something like this?

使用逻辑或条件运算符来控制程序流代替控制结构不是好的做法,不是。这不是那些运营商的目的。 IOW,写作

some_condition && some_action();

替代

if ( some_condition )
  some_action();

不是好的做法。

但是,如果您想要计算一个布尔表达式并将结果赋值到某处,即使其中一个条件是函数调用,也没关系:

result = some_value && some_function();

IOW,我们正在使用 && 运算符 计算一个值 ,而不是控制程序流(即使 && 影响是否 some_function() 被调用)。

同样适用于 ?: 运算符。写作

some_condition ? some_action() : some_other_action();

替代

if ( some_condition )
  some_action();
else
  some_other_action();

是不好的做法。然而,

result = some_condition ? some_function() : some_other_function();

没问题,因为我们不是用它来控制程序流,而是用它来计算一个值。