函数调用之间的 OR 运算符

Posted

技术标签:

【中文标题】函数调用之间的 OR 运算符【英文标题】:OR operator between function calls 【发布时间】:2014-07-18 08:24:33 【问题描述】:

两者之间有什么区别:

if (!bool_function()) 
  void_function();

bool_function() || void_function();

除了可读性?

即使第二个函数返回 void,我可以使用第二种形式吗? 如果bool_function 返回true,是否保证在所有基于C 的编程语言(C++、C#、Java)中不会执行void_function

编辑: 我问的原因是因为在我的 C 编译器上什至没有给出任何警告,并且它按预期工作。我正在使用 IAR Embedded Workbench IDE。

【问题讨论】:

这不是有效的 Java,我怀疑它甚至是有效的 C 这不会在 C# 中编译。 bool_function() || void_function(); 不知道C是否支持,但java不支持。布尔表达式的所有组件都必须是布尔值,因此不允许使用 void。 嗯...在 Java 中,您也可以将 || 运算符应用于布尔值,这意味着 bool_function()||void_function() 不会编译,因为 void_funcion() 不会返回 boolean 这是gcc 所说的:error: void value not ignored as it ought to be bool_function() || void_function(); 【参考方案1】:

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

你不能 or 一个 bool 和一个 void。

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

简而言之 - 不要这样做。使用第一种形式,告诉每个阅读您的代码的人您正在做什么。

【讨论】:

请提供有关“不编译”的更多详细信息。查看我的编辑:它在 C 上运行良好。 @BogdanAlexandru 你确定void_function实际上被定义为返回void吗?如果简单地省略返回类型,则默认为int。 (当然void *void 不同。) @Arkku 无效。编译器设置为 C99,我不确定它到底是什么编译器,它内置在 IAR 中。 @BogdanAlexandru 好的,我无法使用该编译器进行测试,但这绝对是规则的一个例外。顺便说一句,如果您在|| 之后添加演员(void),它仍然有效吗?即boolf() || (void) voidf(); 我忘记了它在 C 标准中的声明位置,但是从 void 转换为其他类型是 未定义的行为,因此不需要是错误。【参考方案2】:

Java specification 表示如果左侧表达式为真,则不计算右侧表达式。 C# 似乎也是如此。如果您查看 C 和 C++ 规范,大概他们会说同样的话。

【讨论】:

如果整个表达式未编译,则不会计算右侧表达式。这不是合法的 Java、C++ 或 C# 代码。它可能是合法的 C,尽管我怀疑它是合法的 C99。【参考方案3】:

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

bool_function() || void_function();

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

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

【讨论】:

以上是关于函数调用之间的 OR 运算符的主要内容,如果未能解决你的问题,请参考以下文章

什么是函数调用?C语言

C语言中啥叫调用函数?为啥函数和函数之间是调用关系?

vc9 和 gcc 之间的不同析构函数行为

C++函数调用运算符 函数对象 函数指针

c语言函数调用例子

函数调用运算符