我想在不使用if else语句的情况下实现三元运算符。 需要使用按位运算符而不使用三元运算符& if else声明。
a= true --> res = b
a= false --> res = c
答案 0 :(得分:4)
您可能意味着您需要无分支源代码。请注意,当源代码中没有任何分支时,编译器可以自由地在程序集中引入分支,反之亦然。
不过,你可以写(!a) * c + (!!a) * b
。为此表达式生成的程序集可能是也可能不是无分支的。我的编译器为它生成恰好无分支的代码(将CMOV指令计为无分支,就是这样):
~ $ cat f.c int f(int a, int b, int c) { return (!a) * c + (!!a) * b; } ~ $ gcc -O -S f.c && cat f.s … testl %edi, %edi setne %al movzbl %al, %eax cmovel %edi, %esi orl $-2, %eax incl %eax andl %edx, %eax addl %esi, %eax popq %rbp ret .cfi_endproc
答案 1 :(得分:2)
res = a ? b : c;
(如果b或c很复杂,可能会添加一些括号)
答案 2 :(得分:0)
使用
a?res=b:res=c
你已经在问题标题中回答了自己。
答案 3 :(得分:0)
试试这个:
a && ((res = b), true);
a || ((res = c), true);
[补充]
我假设您只想使用按位运算符,而res
,a
,b
,c
都是n
- 位有符号整数。然后你可能想试试这个:
res = (b & (((a | (~a + 1)) >> (n - 1)))) | (c & ~(((a | (~a + 1)) >> (n - 1))));
如果a
等于n
的最小值 - 比特有符号整数,例如-2^(n-1)
,则可能导致未定义的行为。但在大多数平台上,过流的结果是可逆的。