【发布时间】:2019-01-17 19:33:10
【问题描述】:
我正在寻找一种简洁的方法来获取一个数字的符号(正或负),并将其传递给另一个数字。
例如:
我们有两个数字,第一个是整数 1,第二个直到执行时才知道。
如果未知数小于0,我们的数就变成-1。
如果未知数大于等于0,我们的数就变成1。
如果我们的未知数是 X:
作为代码:
int before = AnyNonzeroInt(); //for this example we will choose 1.
int X = rand(Int32.Min, Int32.Max);
int after = ...
我个人使用的是 C# 4.5,但我相信一个好的解决方案是与语言无关的。
我可以想到几种方法,但都涉及 if-else-case 语句或三元运算符。我想要一种数学方法。
编辑:
我不反感三元运算符。但是,我正在处理的代码库有一套代码指南,不允许使用三元运算符,因为它们使代码更复杂(我知道我知道.. 我没有制定这个规则)。
但是,我相信我会在下一次团队会议上回答这个问题及其答案,这样我就可以展示我认为三元运算符的必要性。
【问题讨论】:
-
我不明白你对三元组的厌恶。像
(X < 0) ? -1 : 1这样的表达式几乎不会编译成代码(汇编语言会在早餐时吃这样的比较(并将事情设置为 1 或 -1)。做浮点数学会掩盖你的意图,并且会慢得多 -
未知数变零怎么办?
-
@RufusL,根据规则,之后将是
1。 -
强制零的符号为正在数学上似乎不一致,但我知道您希望无论输入如何都设置结果的大小。您正在强制一种特殊情况(当
X=0时),但是要避免在这种情况下使用分支语句。 BTW Fortran 有两个参数sign(x,y)就是这样做的。