这是一个非常奇怪且非常具体的问题。
最终我正在尝试编写一个程序转换,它接受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
}
答案 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());