函数调用之间的OR运算符

时间:2014-07-18 08:24:34

标签: java c# c++ c

之间是否存在任何差异:

if (!bool_function()) {
  void_function();
}

bool_function() || void_function();

除了可读性?

即使第二个函数返回void,我也可以使用第二个表单吗? 在所有基于C语言的编程语言(C ++,C#,Java)中,如果void_function返回true,则bool_function不会被执行吗?

修改: 我问的原因是因为我的C编译器甚至没有发出任何警告,它按预期工作。我正在使用IAR Embedded Workbench IDE。

3 个答案:

答案 0 :(得分:11)

嗯,是的,第二个没有编译。

你不能or布尔和虚空。

更新:你说你的C编译器编译它并且它工作正常。我对此表示怀疑。也就是说,我确定你的编译器会编译它,但bool || void的结果是什么? void总是如此吗?总是假的?有时是一个,有时是另一个?

简而言之 - 不要这样做。使用第一个表单,告诉每个人正确阅读您的代码。

答案 1 :(得分:2)

Java specification表示如果左手一个为真,则不评估右手表达式。 C#似乎也是如此。如果你仔细研究C和C ++规范,他们会说同样的事情。

答案 2 :(得分:0)

如果没有编译错误,我认为它们是相同的。这种现象是所谓的短路评估

  

bool_function()|| void_function();

如果bool_function返回非零值,则无论返回void_function(),值或OR逻辑评估都将为 TRUE ,因此它将跳过执行后面的函数。

并非所有语言都描述这一特性,尤其是某些脚本语言。 短路评估会增加编译器实施的复杂性。