用更简洁的方式写下面的语句 是否有一种更简洁的方法来编写下面的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; int max = 0, u, d, r; if ((u = up()) > max) max = u; if ((d = down()) > max) max = d max = (r = right) > max ? r : max;

用更简洁的方式写下面的语句 是否有一种更简洁的方法来编写下面的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; int max = 0, u, d, r; if ((u = up()) > max) max = u; if ((d = down()) > max) max = d max = (r = right) > max ? r : max;,c++,C++,具体来说,有没有一种方法可以将函数返回的赋值嵌入if语句/三元运算符中?我会这样写: int max = 0; maximize(max, up()); maximize(max, down()); maximize(max, right()); 其中,最大化通过引用获取第一个变量,并将第二个变量作为产品。如果产品大于第一个变量,则将第一个变量设置为产品 void maximize(int& v, int offering) { if (offering > v) {

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

我会这样写:

int max = 0;

maximize(max, up());
maximize(max, down());
maximize(max, right());
其中,
最大化
通过引用获取第一个变量,并将第二个变量作为产品。如果产品大于第一个变量,则将第一个变量设置为产品

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

利益
maximize
的另一个替代方法是使用一行嵌套的-
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);
后一种方法虽然不够简洁,但有以下优点:

  • 线性化的表单比深度嵌套的
    max
    表达式更具可读性
  • 如果需要,您可以在每个最大化步骤之间做一些事情
  • 最大化步骤的顺序是明确的
    • 通过移动各个语句也可以轻松地重新排序

论条件下的指派 现在我们讨论问题的以下部分:

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

如果您坚持这样做,则始终可以使用以下临时变量:

int offer;

if ((offer=up()) > max) {
  max = offer;
}
if ((offer=down()) > max) {
  max = offer;
}

max = ((offer=right()) > max) ? offer : max;
在这种情况下,这不会产生非常可读的代码,但在某些场景中,有一些惯用的方法可以在条件中使用赋值

相关问题
假设:

  • 其想法是删除局部变量(即,以后不需要
    u
    d
    r
  • 评估顺序并不重要
。。。然后您可以只使用
std::max

int m = max(max(max(0, up()), down()), right());
如果这是函数的返回值:

return max(max(max(0, up()), down()), right());
请注意,这可以按任意顺序计算函数,而不是按原始代码中的字符串向上、向下、向右顺序计算
#include <algorithm>
using namespace std;
...

int maxn = max(max(up(), down()), right());
使用名称空间std; ... int maxn=max(max(up(),down(),right());
如果我没弄错的话。

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

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;  
max = std::max(right(), max);
int max = 0, u, d, r;

if ((u = up()) > max)
  max = u;

if ((d = down()) > max)
  max = d

max = (r = right) > max ? r : max;
具体来说,是否有一种方法可以将函数返回的赋值嵌入if语句/三元运算符中


我想指出,如果向上、向下和向右的执行顺序不重要,则应使用以下顺序:

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

因为它最大限度地减少了结果依赖性,并且应该在普通超标量CPU上执行得更快。

u、d、r变量呢?@bortao:我假设问题的关键是让它们变得不必要。如果你真的需要这些变量,@bortao,然后像在Alan的代码中那样分配它们,并在Jon的代码中的函数调用中使用它们。这也可能不仅仅是美学问题。它们对于保证评估的顺序可能很重要。在乔恩的代码中,右<代码>可以在 Up> 下/<代码>之前进行评估,即使原始代码已经被最后评估。@ RB:对,我记不起C++中的评估顺序的细节。我将编辑以澄清这一点。出于兴趣,副作用从何而来?当然,每个函数在任何一种情况下都会执行一次,对吗?诚然,在我的回答中,排序变得很重要——但在你的陈述中,就我所知,排序并不重要。对不起,你是对的!我想到的是C宏。相应地编辑了答案。