代码之家  ›  专栏  ›  技术社区  ›  Alan

用更简洁的方式写下面的语句

c++
  •  5
  • Alan  · 技术社区  · 14 年前

    是否有更简洁的方式来编写下面的C++语句:

    int max = 0;
    
    int u = up();
    if(u > max)
    {
     max = u;
    }
    
    int d = down();
    if(d > max)
    {
    max = d;
    }
    
    int r = right();
    max = r > max ? r : max;  
    

    具体来说,有没有一种方法可以将函数返回的赋值嵌入if语句/三元运算符中?

    7 回复  |  直到 14 年前
        1
  •  9
  •   Jon Skeet    14 年前

    假设:

    • u , d , r (稍后)

    ... 那你就用 std::max :

    int m = max(max(max(0, up()), down()), right());
    

    如果这是函数的返回值:

    return max(max(max(0, up()), down()), right());
    

        2
  •  3
  •   Reinderien    14 年前
    #include <algorithm>
    using namespace std;
    ...
    
    int maxn = max(max(up(), down()), right());
    

    如果我没弄错的话。

        3
  •  3
  •   cyberguijarro    14 年前

    可以在if语句中嵌入赋值,但不能嵌入变量声明:

    int max = 0, u, d, r;
    
    if ((u = up()) > max)
      max = u;
    
    if ((d = down()) > max)
      max = d
    
    max = (r = right) > max ? r : max;
    
        4
  •  2
  •   ariel    14 年前
    int u = up(), d = down(), r = right();
    int max = (u > d) ? u : d;
    max = (max > r) ? max : r;
    

    具体来说,有没有一种方法可以将函数返回的赋值嵌入if语句/三元运算符中?

    那会产生可怕的易读性

        5
  •  2
  •   Oliver Charlesworth    14 年前
    max = std::max(right(), max);
    
        6
  •  1
  •   Community CDub    8 年前

    int max = 0;
    
    maximize(max, up());
    maximize(max, down());
    maximize(max, right());
    

    在哪里? maximize 通过引用获取第一个变量,并将第二个变量作为产品。如果产品大于第一个变量,则第一个变量设置为产品。

    void maximize(int& v, int offering) {
       if (offering > v) {
          v = offering;
       }
       // or use std::max
    }
    

    好处

    另一种选择 最大化 这是一行吗- max 表达式:

    // nested-max alternative; more "functional" style
    int v = max(max(max(defaultValue, val1), val2), val3);
    

    将此与多步骤优化最大化过程进行对比:

    // multi-step maximize alternative; more "imperative" style
    int v = defaultValue;
    maximize(v, val1);
    maximize(v, val2);
    // perhaps do something else in between...
    maximize(v, val3);
    

    后一种方法虽然不够简洁,但提供了以下内容:

    • 线性化的形式比深度嵌套的形式可读性更好 最大值 表达
    • 如果需要,可以在每个最大化步骤之间做一些事情
      • 通过移动单个语句也很容易重新排序

    条件中的赋值

    现在我们来讨论这个问题的以下部分:

    具体来说,有没有一种方法可以将函数返回的赋值嵌入if语句/三元运算符中?

    int offer;
    
    if ((offer=up()) > max) {
      max = offer;
    }
    if ((offer=down()) > max) {
      max = offer;
    }
    
    max = ((offer=right()) > max) ? offer : max;
    

    相关问题

        7
  •  1
  •   Nordic Mainframe    14 年前

    我想指出的是,如果上、下、右的执行顺序不重要,那么应该使用以下顺序:

    max(max(0,up()), max(down(),right())