如何实现三元运算符a?b:c,不使用if else和分支

kap*_*dit -2 c bit-manipulation ternary-operator

我想在不使用if else语句的情况下实现三元运算符。需要使用按位运算符而不使用三元运算符和if else语句来实现。

a= true --> res = b
a= false --> res = c
Run Code Online (Sandbox Code Playgroud)

Pas*_*uoq 5

您可能意味着您想要无分支的源代码。注意,当源代码中没有分支时,编译器可以自由地在程序集中引入分支,反之亦然。

不过,您仍然可以编写(!a) * c + (!!a) * b。为此表达式生成的程序集可能是也可能不是无分支的。MY编译器为其生成的代码恰好是无分支的(将CMOV指令视为无分支):

〜$猫FC
int f(int a,int b,int c){
  返回(!a)* c +(!! a)* b;
}
〜$ gcc -O -S fc && cat fs
…
    testl%edi,%edi
    塞特纳尔
    movzbl%al,%eax
    cmovel%edi,%esi
    orl $ -2,%eax
    包括%eax
    和%edx,%eax
    地址%esi,%eax
    popq%rbp
    退回
    .cfi_endproc

  • @Lundin我将保留它,因为如果`a`的类型为'_Bool'可以很容易地进行优化。 (4认同)