当在条件表达式中使用时,gcc或其他编译器是否会按位或自动转换为布尔值?

Ros*_*ers 3 c c++ gcc

如果我有一个带有逻辑OR运算符的C语句||:

if (isFoo() || isBar())
    blah();
Run Code Online (Sandbox Code Playgroud)

我知道isBar()如果isFoo()返回true ,编译器生成的代码将不会执行.

那么按位OR运算符| ?

if (isFoo() | isBar())
    blah();
Run Code Online (Sandbox Code Playgroud)

可能这是草率的写作,或者如果作者要求 isBar() 并且 isFoo()由于这些功能的副作用而被执行,那么他们应该更清楚地表达他们的意图.或许我错了,这是一个可接受的C/C++习语.

然而,将一个体面的编译器实际上生成一个临时变量做的返回值的比特OR isFoo()isBar()优化时是否开启?或者它会将按位OR运算转换为逻辑OR运算,以便允许布尔表达式的短路,以防止调用isBar()

R..*_*R.. 9

编译器可以根据需要自由地优化"或",但程序必须表现得就像两个函数调用实际发生一样,并且它们可能以任何顺序发生.这实际上咬了我一次,我天真地改变了|||,因为我需要两次调用发生,但忘记了右手的呼叫可以在左边的一个发生之前和右侧一个在左侧的结果取决于一个人......并且直到有人决定尝试编译我的代码pcc而没有显示错误gcc.所以我的建议是要小心这样的东西,并清楚地写出你的意思.

最后,请注意我说"好像两个函数调用实际上都发生了",因为在编译器可以确定某个函数没有副作用的情况下,如果左侧导致的话,它可能会优化右侧非零值.

  • 或者它可以优化`||`(两个分支)到`|`如果它确定两个函数都没有副作用并且在内联时变得微不足道.:-) (2认同)