不在Java中使用if语句

时间:2011-10-31 07:57:21

标签: java esoteric-languages

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

最终我正在尝试编写一个程序转换,它接受java源代码,并将其转换为不使用(除其他外)

  • 阵列
  • 循环
  • 用户定义的方法
  • 如果陈述

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

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

在C ++中,我使用标签和getos,也许?:但是,Java不支持GOTO语句。

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

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

如何对其进行转换,使其在功能上相同,但不使用if关键字。请注意,循环结构也是不可能的。

鉴于此,创建else和else if语句会很容易。 但是我也不确定如何使用它创建循环,因为没有GOTO语句和方法是不可能的。

编辑: 请注意,也不允许切换,也不允许递归(由于无法定义用户方法而导致排除,并且递归主函数不适用于每个程序) ?:运算符不适用于所有情况。 AFAIK你不能用?:调用void函数,因为它想要将一个值作为其操作的一部分。

这些条件来自IB计算机科学SL需要课程,我正在考虑HL和作为课程,我们嘲笑SL的“掌握”因素,包括'if'陈述(如果事实是3/15他们是'用户定义的方法有参数和返回类型)挑战是有效地在SL中进行精通测试,同时仍然生成一个正常运行的程序。

答案:(通过bdares)

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

5 个答案:

答案 0 :(得分:2)

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

可以转换为:

A?X():Y();

您可以根据需要嵌套这些内容,或者只需移除:的一侧即可获得简单的if。条件很简单。

如果你想让它适用于void方法,可以采用以下方法:

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

答案 1 :(得分:2)

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

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

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

Java语言没有goto但是虚拟机有它,所以你当然也可以直接生成JVM指令,尽管这与常规的Java编译器没什么不同,后者也会将所有ifs循环转换成跳转指令。 / p>

答案 2 :(得分:1)

我不确定是否可以在不使用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语句),测试和维护就越容易。

答案 3 :(得分:0)

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

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

相当于:

isPositive = (x >> 31) == 0;

修改

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

答案 4 :(得分:0)

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

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 lambdas会更好:

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