に否定し、その逆に正の数を変換する2つの一般的な方法があります。は、C#
var a = -a;
と
var a = (-1)*a;
は、私が知っているように、第2は、好ましいが、しかし、なぜですか?そして、数値の符号(int、float、doubleなど)を変換する他のベストプラクティスはありますか?
EDIT:単項マイナス演算と-1の乗算に違いはありますか?
に否定し、その逆に正の数を変換する2つの一般的な方法があります。は、C#
var a = -a;
と
var a = (-1)*a;
は、私が知っているように、第2は、好ましいが、しかし、なぜですか?そして、数値の符号(int、float、doubleなど)を変換する他のベストプラクティスはありますか?
EDIT:単項マイナス演算と-1の乗算に違いはありますか?
オンサイト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
あなたは、私がずっとsimplierと短いメソッドMのためのコードを見ての通り。 次に-a
が良い方法です。
ohh、ありがとう!それは私が探しているものです! –
私は最初の方がずっと簡単で、いつもこの方法を使用しているので、2番目の方法が好ましい方法だと思うのはなぜわかりません。 2番目の方法も非常に一般的ですが、コードの量を最小限に抑えたい場合には使用されませんが、すべてを明確にする場合は2番目の方法をお勧めします。 Math.abs(x)を使用しても構いませんが、最初の方法を間違いなく推奨します。 Math.absについてもっと知りたい場合は、googleから多くのチュートリアルを見つけることができます。 これはあなたの質問を解決したいと考えています。 :)
あなたは二番目が好ましいと思いますか?私にひどく汚れているようだ。 'a'が' int.MinValue'/'long.MinValue'であると単純に期待しないので、どちらも動作しないことに注意してください... –
' int a = 1'と 'a = -a'のようなもの。 – J3soon
私はどんな数字でも意味します...だからジョン・スケート - あなたは正しいですが、正しいバージョンを示唆せず、私の質問に答えませんでした。 –