在Java中没有使用if语句



这是一个非常奇怪的问题。

最终我试图写一个程序转换在java源代码,并转换它,使它不使用(除其他外)

    数组
  • 循环
  • 用户自定义方法
  • If语句

这是我给自己设定的一个挑战,因为我的老师告诉我,不使用这些东西是不可能写程序的。

我已经解决了大部分问题,包括函数内联和数组替换,但是我不知道如何管理if语句。

在c++中,我会使用标签和GOTO,可能还有?:,但是Java不支持GOTO语句。

我的问题是:给定一段代码,

if(CONDITION)
{
   //More code in here
}

如何转换它,使其在功能上相同,但不使用if关键字。注意,循环结构也不在考虑范围之内。

考虑到这一点,创建else和else if语句就很容易了。然而,我也不确定如何使用它来创建循环,因为没有GOTO语句和方法是不可能的。

编辑:请注意,开关也是不允许的,递归也是不允许的(因为您不能定义用户方法,并且递归main函数不能用于每个程序)。操作符并非适用于所有情况。我猜你不能用?:来调用void函数,因为它想要赋值作为其操作的一部分。

这些条件来自IB计算机科学SL要求课程,我正在学习HL,作为一个班级,我们嘲笑SL的"掌握"因素,其中包括"if"语句(如果事实中有3/15是"带有参数和返回类型的用户定义方法")。挑战是在SL中有效地失败掌握测试,同时仍然产生正确运行的程序。

答案:(By bdare)

String result = (CONDITION)?"0":"A";
try{
    Integer.parseInt(result);
    //Condition is true
} catch(NumberFormatException e){
    //Condition is false
}
if(A) {
    X();
}
else{
    Y();
}

可以转换为:

A?X():Y();

你可以嵌套这些你想要的,或者简单地删除一侧的:和得到一个简单的if。条件很简单。

如果你想让它为void方法工作,这里有一个方法:

String result = A?"0":"A";
try{
    Integer.parseInt(result);
    X();
} catch(NumberFormatException e){
    Y();
}

我不确定不使用if语句是否可以编写完整的有用程序。然而,我认为你的老师可能想说的是,你可以通过使用更面向对象的方法来代替if语句来编写遵循相同"逻辑"路径的代码。例如:

public interface Moveable {
  void move(int x, int y);
}
public class Ball implements Moveable {
  private int x;
  private int y;
  public void move(int x, int y) {
    this.x = x;
    this.y = y;
  }
}
public class NullMoveable {
  public void move(int x, int y) {
    // Do nothing.
  }
}

…然后在主应用程序代码中:

Moveable mv = new NullMoveable();    
// Move object; don't care if it's a Ball or a NullMoveable
// so no need to explicitly check with an if-statement.
mv.move(10, 50);
这里的原则是,代码中可能的路径越少(由于if语句),测试和维护就越容易。

可以使用条件运算符和开关:

switch( CONDITION ? 1 : 0 )
{
    case 1:
        //... true code
        break;
    case 0:
        //... false code
        break;
}

对于循环,您可以将代码展开到某个预定义的最大值,并根据某些条件使用带标签的中断来提前跳出已展开的代码。在Java中,你可以使用break来结束任何代码块,而不仅仅是循环。

Java语言没有goto,但是虚拟机有它,所以你当然也可以直接生成JVM指令,尽管这与普通的Java编译器没有太大的不同,它也将所有的if和循环转换成跳转指令。

在某些情况下,您可以使用位操作。例如:

if(x > 0) // positive number
{
    isPositive = true;
}
else // negative number
{
    isPositive = flase;
}

等价于:

isPositive = (x >> 31) == 0;
编辑:

这只是一个例子,当然你可以用一条语句做更复杂的位操作,而不是使用一堆if语句。

如果允许使用匿名内部类(这些可能被归类为用户定义的方法,但我将让您来判断):

if(COND) {
  X();
} else {
  Y();
}

就变成:

ifReplacement(COND, 
              new Runnable() { public void run() { X();}},
              new Runnable() { public void run() { Y();}});
与签名:

public static void ifReplacement(boolean condition,
                                 Runnable ifBranch,
                                 Runnable elseBranch)

当然,JDK8 lambda会使这更好:

ifReplacement(COND, ()->X(), ()->Y());

最新更新