C#論序やコンパイラの挙動
-
08-06-2019 - |
質問
クライアントまで、フルのC#(気軽に回答のその他の言語)どのような順番にランタイムの評価ロジック。
例:
DataTable myDt = new DataTable();
if (myDt != null && myDt.Rows.Count > 0)
{
//do some stuff with myDt
}
る計算書は、実行時アクセスの評価の一
myDt != null
または:
myDt.Rows.Count > 0
?
ある時代のコンパイラのう評価の後退か?かき"または"オペレーターが関与しているか?
&として知られる論理ビット単位のオペレーターとともにこのような評価サブ表現
何が良い例するために使用されるビット単位のオペレーターの代わりに"短絡boolean"?
解決
C#:左より、処理が停止した場合不一致であると評価false)が見られる。
他のヒント
"C#:左より、処理が停止した場合、一致に評価しtrue)のとおりである。"
ゾンビ羊が間違っているのは、なrepなったときに、初めてその投票です。
問題は、&&オペレーターではなく、||演算子です。
の場合の評価が止まる場合は、FALSEが見られる。
の場合は||評価が停止した場合TRUEのとおりである。
いうこの問いて回答してしまいましたが、まず私を捨てる別のビットの情報に関する。
言語、C++できる過負荷の行動は、&&と||事業者であることをおすすめ せんこ.これには大きな違いがあったと思い過負荷のこの行動、また強制力の評価の両面に動作します。これは生は二つのことをやろうとしてい
- れていますが、怠け者評価機構では過負荷で機能を呼び出されるとの両方のパラメータの評価前の呼び出します。
- の評価のパラメータな保証できるコンパイラの固有のものです。そのためのオブジェな行動をとれるのと同じ方法の例示の質問/前の応答となります。
詳細は、読み取りスコットMeyersので、 より効果的なC++.感謝!
vb.net
if( x isNot Nothing AndAlso x.go()) then
- 評価は左
- び オペレーターを確認した場合に限り、左側の右側に評価されます(非常に重要でifxは何もない。くまクラッシュ)
使 や 代わりにofAndAlso vb.その場合は、左側が評価されて、右側はまずます。
最良の実践例:常に使びない限り、すいません。
また、フォローアップなぜかするおそれがある場合は誰にも使わび(または&ではなく&&): 以下に例を示します。
if ( x.init() And y.init()) then
x.process(y)
end
y.doDance()
この場合、たいinit X-YYすことで初期化する必要があるためにy.DoDanceきを実行することを示しています。しかし、init()関数んでいるのもつかの余分なもののようにチェックソケットは、場合にのみ動作するアウトok、 両, ったものの、見ていて気分が良いものになる。プロセス(y)
これはどのように変動するという必要な優雅に99%の場合には、そのようにデフォルトすべき使用 び.
@shsteimer
の概念は謙虚さが参照するオペレーターの過負荷.の声明...を評価する場合、最初に評価していきfalseの場合ははいを評価します。同じように
なオペレーターの過負荷.オペレーターの過負荷のう定義するカスタム挙動通信事業者など*,+,=。
こう書き方を自'ログ'クラス、その
a = new Log(); // Log class overloads the + operator
a + "some string"; // Call the overloaded method - otherwise this wouldn't work because you can't normally add strings to objects.
この
a() || b() // be never runs if a is true
うという 短絡評価
ZombieSheepドライバーが必死に車を止します。のgotcha"が待っているのはここだけtrueをご利用の場合は、&&。使用時のオペレーター、表現の評価、その一方又は双方の評価をfalseになります。
if (amHungry & whiteCastleIsNearby)
{
// The code will check if White Castle is nearby
// even when I am not hungry
}
if (amHungry && whiteCastleIsNearby)
{
// The code will only check if White Castle is nearby
// when I am hungry
}
場合がありますので注意して差&&とに関してどのくらいの表現を評価します。
&&として知られており短絡およびbooleanに、指摘されたように、その他あなたの停止の場合は、その決定が、すべてのサブ表現について審査を行います。
&として知られる論理ビット単位のオペレーターとともにこのような評価サブ表現です。
ど:
if (a() && b())
まだコ b の場合 a を返します true.
しかし、この:
if (a() & b())
常に通話も a や b, もの呼び出しの結果を a がfalseの場合、このように知られてい false 結果にかかわらず、呼び出し b.
この差が存在するために、及び/ます。
いくつかの言語で興味深い場面表現の実と異なる。私は具体的には考えていルビーが、思いから拝借しました他の場所でしょうPerl).
の表現のロジック滞在を左右すが、例えば:
puts message unless message.nil?
上記の評価"メッセージ。nil?"してい評価をfalseにない場合はのような場合を除くそれが実行時の状態がfalseの代わりにtrue)"をメッセージ"を実行し、版画の内容のメッセージ変数の画面になります。
このような面白い構造コード時に---私のように使うのには非常に短い1ライナーのようです。
編集:
で少しをより明確にし、上記と同じです:
unless message.nil?
puts message
end
左は、その停止の場合はnullになります。
編集:にvb.net で評価がスローエラーを使用しない限りび
の概念は謙虚さが参照するオペレーターの過負荷.の声明
if( A && B){
// do something
}
を評価する場合、最初に評価していきfalseの場合ははいを評価します。同じように
if(A || B){
//do something
}
を評価する場合、最初に評価していきtrue、Bは決して評価されます。
このコンセプト、オーバーロードされ(う)すべてのCスタイル、言語、その他多数。
Nopes、少なくとも、C#コンパイラな後退(&&や||).ではオフにします。
どうにもならない場合はすべてインラインという大きさでありながら実行が左から右に配置される.
どうにもならない場合は入れ子という大きさでありながら実行され内部への外にこれは混乱して通常の"奥"の右側にこのような後退...
例えば、
a = Foo( 5, GetSummary( "Orion", GetAddress("Orion") ) );
行うようになります:
- 電話
GetAddress
をリテラル"Orion"
- 電話
GetSummary
をリテラル"Orion"
その結果のGetAddress
- 電話
Foo
をリテラル5
その結果のGetSummary
- この値を割り当て
a
私のようにOrionの対応.私は追加生は二つのことをやろうとしてい
- 左右へのまだ適用されず
- 内部への外側に全ての引数を解決の呼び出し機能
と言ってもいい、以下の例:
a = Foo(5, GetSummary("Orion", GetAddress("Orion")),
GetSummary("Chris", GetAddress("Chris")));
この実行:
GetAddress("Orion")
GetSummary("Orion", ...)
GetAddress("Chris")
GetSummary("Chris", ...)
Foo(...)
- 付与
a
なってC#'sの法的要件がった試験で同様の例だろうと書き込む前にこの後もこの順序は保証されるJava.
終わってしまうため完全性(これは言語-agnosticスレッドなどがあり、言語のようにCとC++の順序は保証されませんがある場合を除き、配列。参考文献: 1, 2.に応答にスレッドの問題が &&
や ||
ている配列をポイントC++できる限り負荷;もOJの優れた.その一例:
foo() && bar()
foo() & bar()
の &&
の場合、 foo()
を作成する前に実行する bar()
(後者は全) &&
である。の &
場合は、保証を行うものではあ(C、C++、実際 bar()
で作成する前に実行する foo()
, たします。
何が良い例するために使用されるビット単位のオペレーターの代わりに"短絡boolean"?
いフラグというファイル属性です。かんの定義として読み込み4、2、EXECとして1.バイナリは、そ:
READ 0100
WRITE 0010
EXEC 0001
各フラグはビットセットではユニークです。のビット単位での事業者またはこれらを組み合わせ旗:
flags = READ & EXEC; // value of flags is 0101
と聞いていどこかにそのコンパイラでコンパイル作業の逆ものについて不明な点trueのことです。
ご使用の場合で具体的には評価をしたいすべてのサブ表現がないため、副作用したいものの、最終結果 false な実行を行う その の一部 の場合す。
ご注意&よび|動の両方のビット単位のマスクおよびboolean型の値は、どのようなビット単位です。彼らは という ビット単位で定義された両方の整数booleanデータ型のクライアントまで、フルのC#.
また、フォローアップなぜかするおそれがある場合は誰にも使わび(または&ではなく&&):以下に例を示します。
if ( x.init() And y.init()) then x.process(y) end y.doDance()
この場合、たいinit X-YYすことで初期化する必要があるためにy.DoDanceきを実行することを示しています。しかし、init()関数んでいるのもつかの余分なもののようにチェックソケットは、場合にのみ動作するアウトokの両方のために、私は見ていて気分が良いものになる。プロセス(y)
私はこれはかなり混乱している。が例の作品ではない、典型的なケースを使用 And
(という書くことを違うよ). And
(&
他のほとんどの言語)を実際にビット単位で、動作します。ときに使うので計算のビット操作は、例えば削除フラグビットまたはマスキングおよび試験旗:
Dim x As Formatting = Formatting.Bold Or Formatting.Italic
If (x And Formatting.Italic) = Formatting.Italic Then
MsgBox("The text will be set in italic.")
End If
Dプログラミング言語にはない 左右への評価の内部短絡 や な きの過負荷の &&
と'||' います。