这是一个非常奇怪的问题。
最终我试图写一个程序转换在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());