【问题标题】:Is it possible to find out which number is bigger without using an if statement?是否可以在不使用 if 语句的情况下找出哪个数字更大?
【发布时间】:2011-11-11 20:03:10
【问题描述】:

我正在为初学者编程课程做一些小程序,在我的程序中,我有 2 个保存数字的变量。无论如何,我需要找出哪个数字更大并根据它打印适当的消息,例如我有:

int x = 5;
int y = 10;

我需要打印:

"确实y大于x";

现在问题是我知道我可以使用一个简单的 if 语句,但我不允许使用它,现在这让我想知道,这甚至可能吗?如果是这样,我该怎么做?如何在不执行以下操作的情况下检查哪个数字更大:

if (x > y) 
    answer = true;

...

提前致谢。

【问题讨论】:

    标签: java if-statement


    【解决方案1】:

    你可以这样做:

    boolean answer = x > y;
    

    表达式x > y 只是boolean 类型的表达式。虽然boolean 表达式经常用于if 语句、循环等中的条件,但它们不一定是 - 简单的赋值也可以。

    听起来你想要反过来:

    boolean answer = y > x;
    

    然后你可以使用answer的值来构建要显示的字符串...

    【讨论】:

    • 好的,这就是我需要的!就这么简单。
    【解决方案2】:

    使用三元运算符:

    System.out.println(x > y ? "It is true that x is greater than y" : "");
    

    【讨论】:

      【解决方案3】:

      三元运算符“?:”

      String output = (x > y)? "x is greater than y":"y is greater than x"; 
      

      【讨论】:

        【解决方案4】:

        其他人提到的三元条件运算符将起作用。假设您正在寻找创造性的方法而不是实用的方法,这里有另一种方法:

        int x = 5;
        int y = 10;
        while(y > x){
          System.out.println("It is true that y is bigger than x.");
          return;
        }
        System.out.println("It is false that y is bigger than x.");
        

        while 只是作为一个花哨的if,因为return 意味着否则无限循环最多只会执行一次。

        这是另一个依赖于短路布尔评估的示例:

        public static void main(String...args){
          int x = 5;
          int y = 10;
          boolean answer = (y > x);
          boolean testTrue = answer && printTrue();
          boolean testFalse = testTrue || printFalse();
        }
        
        private static boolean printFalse() {
          System.out.println("It is false that y is bigger than x.");
          return true;
        }
        
        private static boolean printTrue() {
          System.out.println("It is true that y is bigger than x.");
          return true;
        }
        

        当然,您不应该在实际的生产代码中这样做,但是想出非正统的编码方式会很有趣,并且有助于探索该语言。

        【讨论】:

          【解决方案5】:

          您的问题被标记为 Java,但您没有在问题中指定 Java。在 Java 中,有多种方法可以获得相同的结果,包括以某种方式测试布尔表达式 x > y,例如三元运算符。我认为这些等同于明确的if 声明。

          其他可能性:

          • 计算x - y 的平方根。如果y 更大,这将引发异常。在调用者中捕获异常并报告y 是较大的数量。如无异常,报x较大。
          • 在 LISP、Ruby 或其他支持符号类型的语言中,形成一个列表 ((symbol x, x), (symbol y, y)) 并对列表进行排序。然后将第二个符号报告为具有较大值的变量。
          • 如果使用汇编、BASIC、PL/1 等,您可以使用算术表达式来选择GOTO 语句的目标。根据 xy 是否更大,执行将在代码的不同部分恢复。或者使用上一个项目符号中的列表排序技巧来选择GOTO 标签。
          • 一般来说,表达式((x - y) / abs(x - y) + 1) / 2 将在x 较大时产生1,而在y 较大时产生0。此结果可用于从两个备选方案列表中选择数据、函数等,从而在没有 if 语句的情况下产生条件行为。

          【讨论】:

          • 因为他标记了Java,所以他不需要在问题中指定Java......这不是标签的用途吗?
          • 他确实讲过初级编程课程。我希望他的课程不会假定 Java 就是 The Way It Is Done TM。
          • 是的,我知道我没有在问题中提到 java,因为我已经知道 c#,而且我会得到什么代码语言答案对我来说并不重要。无论如何,这个解决方案太先进了,但它无疑是我在这篇文章中收到的最有趣的一个:) 非常感谢!
          【解决方案6】:

          你可以使用递归(但我不推荐)

          public int compare ( int a , int b )
          {
              switch ( a )
              {
                    case Integer.MIN_VALUE :
                        switch ( b )
                        {
                           case Integer.MIN_VALUE :
                              return 0 ;
                           default :
                              return -1 ;
                        }
                     default :
                        switch ( b )
                        {
                            case INteger.Min_VALUE :
                                return 1 ;
                            default :
                                return compare ( a-1 , b-1 ) ;
                         }
          
              }
          }
          

          【讨论】:

          • 很好的解决方案,但是对于这个特定问题来说,switch case 太高级了
          • 我正在教一门课,想用开关盒向他们展示 a
          【解决方案7】:

          (a+b)/2 + Abs(a-b)/2 是较大的数。

          【讨论】:

            【解决方案8】:

            我知道在某些语言中,您可以使用短路评估来构造答案。

            如果 A 为真,则表达式 (A && B) 的计算结果始终为 B。如果 A 为假,则永远不会评估 B。 同样,如果 A 为假,(A || B) 的计算结果为 B。如果 A 为真,则永远不会评估 B。

            虽然我不是 100% 确定 Java,但您想要的表达式是:

            String output = ((x > y) && "it is true that X is greater than Y") 
              || (((x < y) && "it is true that X is less than Y")
              || "it is true that X is equal to Y");
            

            【讨论】:

            • 您可以利用短路评估(请参阅my answer),但您的答案将无法编译,因为它将boolean 类型与String 类型混合。
            猜你喜欢
            • 2019-03-01
            • 1970-01-01
            • 2011-09-21
            • 2015-04-07
            • 1970-01-01
            • 2013-03-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多