gpt4 book ai didi

c# - 这些操作是等价的吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:15:19 28 4
gpt4 key购买 nike

我正在重构一些代码,我偶然发现了这样一段话。

if (a > 1.0)
a = 1.0;
else if (a < -1.0)
a = -1.0;

根据我们得到的指南,我应该将其重构为这样的东西。

if (Math.Abs(a) > 1.0)
a = a < 0 ? -1.0 : 1.0;

当然,只有在不改变语句逻辑的情况下才允许重构。我已经通过并没有看到任何偏差或差异。我还编写并运行了一系列测试,真正试图找出棘手和前卫的案例。一切似乎都很好。

然后,同事偷看了一眼,用非常毒舌的口气暗示说,那里有什么痒痒的东西。他应该在第二天揭开这个大 secret ,但后来他生病了,现在他正在休假。

这几天我一直在注视着这些线条。我已经睡过了。我已经尝试了袖子里的所有技巧。没有什么!所以要么我只是不擅长看它,要么他只是个玩恶作剧的 SCSS 。我需要帮助确定。

最佳答案

是的,它们是一样的。 更新:但与案例Int.MinValue无关\Long.MinValue等,如Math.Abs会抛出 OverflowException - 感谢@SledgeHammer/@Quantic! - 所以这可能是问题所在。

“证明”方法相同(减去溢出)

if (Math.Abs(a) > 1.0)
a = a < 0 ? -1.0 : 1.0;

与:( ?:if )相同

if (Math.Abs(a) > 1.0)
{
if (a < 0)
{
a = -1.0;
}
else
{
a = 1.0;
}
}

这与:(写出 Math.Abs )

if (a > 1.0 || a < -1.0)
{
if (a < 0)
{
a = -1.0;
}
else
{
a = 1.0;
}
}

这与:(翻译 ||if - else if )

if (a > 1.0)
{
if (a < 0)
{
a = -1.0;
}
else
{
a = 1.0;
}
}
else if (a < -1.0)
{
if (a < 0)
{
a = -1.0;
}
else
{
a = 1.0;
}
}

删除死代码:

if (a > 1.0)
{
if (a >= 0) //else
{
a = 1.0;
}
}
else if (a < -1.0)
{
if (a < 0)
{
a = -1.0;
}
}

现在删除不需要的(内部)if小号:

if (a > 1.0)
{
a = 1.0;
}
else if (a < -1.0)
{
a = -1.0;
}

完成:)

PS:如果愿意,为了便于阅读:

if (a > 1.0)
a = 1.0;
else if (a < -1.0)
a = -1.0;

更新:Math.Abs​​

来自 Math.Abs(a) > 1.0a > 1.0 || a < -1.0

Math.Abs(a) > 1.0

Math.Abs(a)等同于(参见 reference source )

a >= 0 ? a : -a 

一样

if (a >= 0)
{
return a;
}
else
{
return -a;
}

所以添加了条件:

if (a >= 0)
{
return a > 1.0;
}
else
{

return (-a) > 1.0;
}

重写条件:

if (a >= 0)
{
return a > 1.0;
}
else
{
return a < -1.0;
}

else 对于 (a >= 0) 永远不会为真, 所以

a > 1.0 || a < -1.0

关于c# - 这些操作是等价的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39862461/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com