有亦然2種常見的方式來轉換正數負和副負數最佳實踐:積極在C#
var a = -a;
和
var a = (-1)*a;
其次是首選,因爲我知道,但爲什麼?在轉換數字符號(int,float,double等)方面還有其他的最佳做法嗎?
編輯:一元減法運算和乘法運算有沒有區別?
有亦然2種常見的方式來轉換正數負和副負數最佳實踐:積極在C#
var a = -a;
和
var a = (-1)*a;
其次是首選,因爲我知道,但爲什麼?在轉換數字符號(int,float,double等)方面還有其他的最佳做法嗎?
編輯:一元減法運算和乘法運算有沒有區別?
現場http://tryroslyn.azurewebsites.net/您可以看到編譯器生成的代碼。
併爲:
using System;
public class C {
public int M() {
int a = -2;
a = -a;
return a;
}
public int M1() {
int a = 3;
a = (-1) * a;
return a;
}
}
編譯器生成:
.class private auto ansi '<Module>'
{
} // end of class <Module>
.class public auto ansi beforefieldinit C
extends [mscorlib]System.Object
{
// Methods
.method public hidebysig
instance int32 M() cil managed
{
// Method begins at RVA 0x2050
// Code size 4 (0x4)
.maxstack 8
IL_0000: ldc.i4.s -2
IL_0002: neg
IL_0003: ret
} // end of method C::M
.method public hidebysig
instance int32 M1() cil managed
{
// Method begins at RVA 0x2058
// Code size 8 (0x8)
.maxstack 2
.locals init (
[0] int32
)
IL_0000: ldc.i4.3
IL_0001: stloc.0
IL_0002: ldc.i4.m1
IL_0003: ldloc.0
IL_0004: mul
IL_0005: stloc.0
IL_0006: ldloc.0
IL_0007: ret
} // end of method C::M1
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// Method begins at RVA 0x206c
// Code size 7 (0x7)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0006: ret
} // end of method C::.ctor
} // end of class C
正如你看到的子程序M我更simplier和更短的代碼。 然後-a
是更好的方法。
ohh,謝謝!這就是我想要的! –
我不明白你爲什麼認爲第二種方法是首選方法,因爲第一種方法簡單得多,而且我始終使用這種方法。第二種方法也是一種非常常見的方法,但沒有使用,因爲您希望編寫最少量的代碼,但如果您打算將所有內容都清除乾淨,那麼我寧願使用第二種方法。 你也可以使用Math.abs(x)如果你想,但我肯定會喜歡第一種方法。如果你想了解更多關於Math.abs的信息,那麼你可以通過google找到很多教程。 希望通過某種方式解決了您的問題。 :)
什麼讓你覺得第二個是首選?似乎對我非常混亂。請注意,既不會天真地期望如果'a'是'int.MinValue' /'long.MinValue' ... –
我認爲你的意思是'int a = 1'和'a = -a'類似的東西。 – J3soon
我的意思是任何數字...所以喬恩Skeet - 你是對的,但你不建議任何正確的版本,並沒有回答我的問題 –