如何用一个 if 语句替换此代码? [关闭]

Posted

技术标签:

【中文标题】如何用一个 if 语句替换此代码? [关闭]【英文标题】:How can I replace this code with one if statement? [closed] 【发布时间】:2021-11-14 04:03:07 【问题描述】:

为了挑战,我怎样才能用一个 if 语句替换这段代码?

unsigned int x, y;
cin>>x;
if((x>=0)&&(x<=1)) y = 1;
else if (x<=3) y = 2;
    else if(x<=5) y = 3;
        else y = 6;

【问题讨论】:

你为什么要把它变成一个if 声明?可读性?表现?挑战? 没有一种干净的方法可以做到这一点。也许更好的问题是:您为什么想要用单个if 替换该代码? 挑战,也许我可以用条件运算符“?”替换所有这些,但我找不到解决方案。 0 &lt;= x for unsigned int 总是 true BTW。 看妈妈,没有 div ;) static int value[6]=1,1,2,2,3,3; y=(x&lt;=5) ? value[x] : 6; 【参考方案1】:

制作输入和输出表:

0 — 1
1 — 1
2 — 2
3 — 2
4 — 3
5 — 3
Other — 6

现在做一个逻辑表达式,将特定输入与“其他”区分开来。

x ≥ 0 and x ≤ 5

(注意:unsigned 类型可以去掉与 0 的比较)

现在制作一个公式,根据给定的输入计算给定的输出:

x / 2 + 1

【讨论】:

【参考方案2】:

不知道为什么要使用单个if,很难说。当然,你可以使用没有ifs 的三元运算符:

unsigned int x, y;
cin>>x;
y = x<=1
? 1
: x<=3 
    ? 2
    : x<=5
      ? 3
      : 6;

或者针对一个 if 进行丑陋的布尔转换(请不要在拼图或 codegolf 上下文之外执行此操作):

unsigned int x, y;
cin>>x;
if (x<=5) 
    y = 1 + (int)(x == 2 || x == 3) + (int)(x == 4 || x == 5);
 else 
    y = 6;

或者,如果你坚持完全一个if

unsigned int x, y;
cin>>x;
if (x <= 5) 
   y = x/2 + 1;
 else 
   y = 6;

@Pietrek 的回答向您展示了使用三元运算符的更好变体(此处稍作修改):

unsigned int x, y;
cin>>x;
auto const cutoff = 6;
y = x < cutoff ? x/2 + 1 : cutoff;

请注意,在任何情况下,x &gt;= 0 在处理 unsigned 数据类型时始终为 true,因此我省略了它。


如果这不是纯粹的拼图挑战,而是实际的生产代码,请使用最后一个示例,并将数字 6 设置为 constconstexpr 并使用有意义的名称。

【讨论】:

min 的版本不适用于 x = 6 @anatolyg 好收获!会解决的【参考方案3】:
y = x <= 5 ? x / 2 + 1 : 6;

【讨论】:

以上是关于如何用一个 if 语句替换此代码? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

我如何用Just循环和if语句制作此消息框?

如何用sql语句把查询后的结果那一列数据全部替换。

如何用 IF 语句创建条件?

布尔逻辑:如何简化此 IF 语句?

java中的BufferedReader语句如何用?

如何用 C# 中的函数语句替换 for 循环?