If statement 无if语句的分支

If statement 无if语句的分支,if-statement,language-agnostic,If Statement,Language Agnostic,是否可以不使用if语句来分支代码?是的,您可以,GPU风格 假设您有一个分支的函数,并在末尾返回一个值 float function( float input ) { if( input > 0 ) { // do stuff finalValue = 2+4+8*input; return finalValue ; } else { // do other stuff

是否可以不使用
if
语句来分支代码?

是的,您可以,GPU风格

假设您有一个分支的函数,并在末尾返回一个值

float function( float input )
{
    if( input > 0 )
    {
        // do stuff
        finalValue = 2+4+8*input;
        return finalValue ;
    }
    else
    {
        // do other stuff
        finalValue = 1+input;
        return finalValue ;
    }
}
要在没有分支的情况下实现这一点,您可以编写GPU风格的代码:即,计算两个分支,然后在最后扔掉您不想要的分支

float function( float input )
{
    if( input > 0 )
    {
        // do stuff
        finalValue = 2+4+8*input;
        return finalValue ;
    }
    else
    {
        // do other stuff
        finalValue = 1+input;
        return finalValue ;
    }
}

好了。没有分支的分支,没有if语句的if语句。

取决于“分支”和“if”的含义。以下任何分支,不带“如果”

或三元运算符,如果不计算:

x == 0 ? doFunc1() : doFunc2()
如果您的语言支持函数指针:

funcArray[selectedOption]()
你可以愚蠢地做:

boolean once = true;
while (condition && once) {
  doAWhichNeverReturns();
  once = false; 
} 
doB();

但是我不认为这真的回答了你的问题,因为我不知道你想做什么。

但是实际的
如果
input>0
表达式中仍然存在
,只有语法发生了变化。从性能的角度来看,它可能比原来的更差,因为它有两个evaluation@icepack:我想你错了,这里没有
if
。最重要的是,此代码从不分支或跳转,因此不会停止指令pipelines@mvp在语法上没有
if
,但在语义上它出现在
input>0
表达式中,这将产生类似于
if
的汇编代码。见下面的@James答案。我同意管道系统。@icepack:不太同意<例如,x86上的code>input>0
只是一条
cmp
指令,它纯粹是算术指令-
CMPA,b
设置测试标志,就好像您已经计算了
a-b
。“分支”仅在使用条件跳转指令(例如,
ja
jg
)时发生,该指令不会由该代码生成。我正在简化处理浮点数的细节,虽然有点不同,但原则是成立的。@JonPurdy是的,它设置了标志。接下来对结果做了什么?我试图弄清楚GPU是如何分支的,因为我读了很多地方。就是在那里我意识到这就是你能做到的。
boolean once = true;
while (condition && once) {
  doAWhichNeverReturns();
  once = false; 
} 
doB();