函数调用之间的 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 运算符的主要内容,如果未能解决你的问题,请参考以下文章