5

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

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

  • 数组
  • 循环
  • 用户定义的方法
  • 如果语句

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

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

在 C++ 中,我会使用标签和 goto,也许还有 ?:,但是 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
}
4

5 回答 5

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();
}
于 2011-10-31T08:02:40.910 回答
2

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

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

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

Java 语言没有 goto,但虚拟机有,因此您当然也可以直接生成 JVM 指令,尽管这与常规 Java 编译器没有太大区别,后者还将所有 ifs 循环转换为跳转指令。

于 2011-10-31T08:04:05.150 回答
2

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

于 2011-10-31T08:04:22.343 回答
0

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

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

相当于:

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

编辑:

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

于 2011-10-31T08:15:48.290 回答
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());
于 2011-10-31T09:05:39.730 回答