函数调用之间的OR运算符

3

这两者之间有任何区别吗:

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

并且

bool_function() || void_function();

除了易读性之外,还有什么要考虑的吗?
即使第二个函数返回void,我可以使用第二种形式吗? 在所有基于C的编程语言(C ++,C#,Java)中,是否保证如果bool_function返回true,则不会执行void_function?
编辑: 我问的原因是因为我的C编译器甚至没有任何警告,而且它按预期工作。 我正在使用IAR嵌入式Workbench IDE。

这不是有效的Java代码,我怀疑它甚至都不是有效的C代码。 - Gyro Gearless
这段代码在C#中无法编译。 - Maarten
bool_function() || void_function(); 不知道C语言是否支持,但Java不支持。布尔表达式的所有组成部分都必须是布尔类型,因此不允许使用void。 - BackSlash
嗯...在Java中,您也可以将||运算符应用于布尔值,这意味着bool_function()||void_function()不会编译,因为void_funcion()没有返回boolean - Konstantin Yovkov
这是 gcc 给出的错误提示:error: void value not ignored as it ought to be bool_function() || void_function(); - dragosht
3个回答

11

嗯,是的,第二段代码无法编译。

你不能使用or操作符来对一个布尔值和void类型的值进行逻辑运算。

更新:你说你的C编译器可以编译这个代码并且它可以正常工作。我怀疑这个说法。也就是说,我确信你的编译器可以编译它,但是bool || void的结果是什么呢?void总是true?总是false?有时候是一个,有时候是另一个吗?

简而言之 - 不要这样做。使用第一种形式来明确告诉所有阅读你代码的人你正在做什么。


请提供更多关于“无法编译”的细节。请查看我的编辑:在 C 上它可以正常工作。 - Bogdan Alexandru
@BogdanAlexandru 你确定 void_function 函数确实被定义为返回 void 吗?如果省略了返回类型,它会默认为 int。当然,void *void 不是同一种类型。 - Arkku
@Arkku 这是一个void函数。编译器设置为C99,我不确定它是哪个编译器,它是内置于IAR中的。 - Bogdan Alexandru
@BogdanAlexandru 好的,我无法使用那个编译器进行测试,但这绝对是一个例外。顺便问一下,如果在 || 后面添加一个强制转换 (void),它还能正常工作吗?也就是说,boolf() || (void) voidf(); - Arkku
我忘记了在C标准的哪里声明,但是从void到其他类型的强制转换是未定义行为,因此不需要报错。 - Drew McGowen
显示剩余2条评论

2

Java规范指出,如果左侧表达式为真,则不会评估右侧表达式。同样的情况在C#中也是如此。如果查看C和C++规范,可能会发现它们也会说相同的事情。


如果整个表达式无法编译,则不会评估右手表达式。这不是合法的Java、C++或C#代码。虽然我怀疑它是否是合法的C99,但它可能是合法的C代码。 - zmbq

0
如果没有编译错误,我认为它们是相同的。这种现象被称为“短路求值”。
如果bool_function返回非零值,则无论void_function()的返回值如何,OR逻辑运算的值将为TRUE,因此它将跳过执行后面的函数。
并不是所有语言都描述了这种特性,尤其是一些脚本语言。“短路求值”增加了编译器实现的复杂性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接