سؤال

في C#, (و لا تتردد في الإجابة عن اللغات الأخرى) ، أي طلب لا وقت التشغيل تقييم منطق البيان ؟

على سبيل المثال:

DataTable myDt = new DataTable();
if (myDt != null && myDt.Rows.Count > 0)
{
    //do some stuff with myDt
}

وهو بيان لا وقت التشغيل تقييم أول

myDt != null

أو:

myDt.Rows.Count > 0

?

هل هناك وقت عندما مترجم من أي وقت مضى تقييم البيان إلى الوراء ؟ ربما عندما "أو" المشغل هو المشاركة ؟


& كما هو معروف المنطقية المختصة بالبت المشغل دائما تقييم جميع الفرعية التعبيرات

ما هو مثال جيد عند استخدام المعامل مشغل بدلا من "تماس منطقية"?

هل كانت مفيدة؟

المحلول

C# :من اليسار إلى اليمين ، وتجهيز محطات إذا كانت غير مطابقة (يقيم إلى false) وجدت.

نصائح أخرى

"C# :من اليسار إلى اليمين ، وتجهيز محطات إذا تطابق (يتم تقييمها إلى true) يتم العثور عليها."

غيبوبة الأغنام خطأ لا يكفي مندوب إلى أسفل التصويت عليه.

السؤال هو حول && المشغل لا || المشغل.

في حالة && التقييم سوف تتوقف إذا كانت كاذبة وجدت.

في حالة || التقييم يتوقف إذا كان صحيحا وجدت.

أدرك هذا السؤال تمت الإجابة, ولكن أود أن رمي في آخر جزء من المعلومات ذات الصلة بالموضوع.

في لغات مثل C++, حيث يمكنك فعلا الزائد سلوك && و || المشغلين ، فإنه ينصح بشدة أن تقوم لا تفعل هذا.هذا هو لأنه عندما تفرط هذا السلوك ، كنت في نهاية المطاف إجبار تقييم كلا الجانبين من العملية.هذا أمرين:

  1. فإنه يكسر كسول آلية التقييم لأن الزائد هو الذي يجب أن يكون الاحتجاج ، وبالتالي كل من المعلمات يتم تقييمها من قبل استدعاء الدالة.
  2. من اجل تقييم من قال المعلمات ليست مضمونة ويمكن مترجم محددة.ومن ثم الكائنات لا تتصرف بنفس الطريقة كما هو الحال في الأمثلة المذكورة في السؤال/الأجوبة السابقة.

لمزيد من المعلومات قراءة سكوت مايرز' الكتاب ، أكثر فعالية C++.هتاف!

vb.net

if( x isNot Nothing AndAlso x.go()) then
  1. يتم التقييم من اليسار إلى اليمين
  2. وأيضا مشغل يتأكد ذلك إلا إذا كان الجانب الأيسر كان صحيحا ، الجانب الأيمن سيتم تقييم (مهم جدا لأن ifx شيء x.الذهاب سوف تحطم)

يمكنك استخدام و بدلا ofAndAlso في vb.في هذه الحالة الجانب الأيسر يحصل على تقييم الأولى كذلك ، ولكن الجانب الأيمن سوف تحصل على تقييم بغض النظر عن النتيجة.

أفضل الممارسات:دائما استخدام وأيضا, إلا إذا كان لديك سبب وجيه جدا لماذا لا.


وطلب في متابعة السبب أو عندما يريد أي شخص استخدام بدلا من وأيضا (أو & بدلا من &&): هنا مثال:

if ( x.init() And y.init()) then
   x.process(y)
end 
y.doDance()

في هذه الحالة أريد أن الحرف الأول كل من X و Y.Y يجب تهيئة من أجل y.DoDance أن تكون قادرة على تنفيذ.ومع ذلك ، في init() وظيفة وأنا أفعل أيضا بعض الشيء الإضافي مثل التحقق من مأخذ مفتوحة ، وفقط إذا أن يعمل حسنا ، سواء, أنا يجب أن نمضي قدما ونفعل x.عملية(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 هو ميتة.فقط "مسكتك" التي قد تكون في انتظار أن هذا صحيح فقط إذا كنت تستخدم && المشغل.عند استخدام & المشغل ، سواء تعبيرات وسيتم تقييم كل وقت, بغض النظر إذا كان أحد أو كلا تقييم إلى 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
}

لاحظ أن هناك فرق بين && و & المتعلقة كم من التعبير تقييمها.

&& كما هو معروف قصيرة-دارة منطقية ، ، كما لوحظ من قبل الآخرين هنا, توقف في وقت مبكر إذا كان يمكن أن تكون النتيجة تحديدها من قبل جميع الفرعية تعبيرات يتم تقييمها.

& كما هو معروف المنطقية المختصة بالبت المشغل دائما تقييم جميع الفرعية التعبيرات.

على هذا النحو:

if (a() && b())

سيتم الاتصال فقط ب إذا a يعود صحيح.

ومع ذلك, هذا:

if (a() & b())

دائما ندعو كل a و ب, رغم نتيجة الدعوة a هي كاذبة وبالتالي المعروف أن كاذبة بغض النظر عن نتيجة الدعوة ب.

نفس هذا الفرق موجود على || و | المشغلين.

بعض اللغات الحالات المثيرة للاهتمام حيث تعبيرات يتم تنفيذها في ترتيب مختلف.أنا على وجه التحديد التفكير روبي, ولكن أنا متأكد من أنها اقترضت من أي مكان آخر (ربما Perl).

التعبيرات في المنطق سيبقى اليسار إلى اليمين ، ولكن على سبيل المثال:

puts message unless message.nil?

سبق تقييم "رسالة.لاشيء - " أولا, ثم إذا كان يقيم إلى false (إلا هو لو إلا أنه ينفذ عند الشرط false بدلا من true) "يضع رسالة" سيتم تنفيذ الذي يطبع محتويات متغير الرسالة على الشاشة.

انها نوع من طريقة مثيرة للاهتمام إلى بنية التعليمات البرمجية الخاصة بك في بعض الأحيان...أنا شخصيا أحب أن استخدامه لفترات قصيرة جدا 1 المتشددين مثل المذكورة أعلاه.

تحرير:

لجعله أكثر وضوحا قليلا ، أعلاه هو نفسه:

unless message.nil?
  puts message
end

واحد اليسار ، ثم توقف إذا كانت فارغة.

تحرير:في vb.net فإنه سيتم تقييم كل ورمي ربما خطأ, إلا إذا كنت تستخدم وأيضا

مفهوم التواضع هو اشارة الى هو عامل الحمولة الزائدة.في بيان:

if( A && B){
    // do something
}

يتم تقييمها من الأولى, إذا كان يقيم إلى false ، ب أبدا تقييمها.الأمر نفسه ينطبق على

if(A || B){
    //do something
}

يتم تقييمها الأولى ، إذا لم يتم تقييمها إلى true ، ب أبدا تقييمها.

هذا المفهوم ، إثقال ينطبق على (على ما أظن) كل من ج على غرار اللغات و العديد من الآخرين كذلك.

Nopes على الأقل C# compiler لا يعمل الوراء (في أي && أو ||).إنه من اليسار إلى اليمين.

عندما تكون الأمور كلها في سطر ، إعدامهم من اليسار إلى اليمين.

عندما تكون الأمور متداخلة ، إعدامهم الداخلي إلى الخارجي.قد يبدو هذا مربكا عادة ما "الأعمق" على الجانب الأيمن من الخط ، لذلك يبدو انها تسير إلى الوراء...

على سبيل المثال

a = Foo( 5, GetSummary( "Orion", GetAddress("Orion") ) );

تحدث أشياء من هذا القبيل:

  • الاتصال GetAddress مع الحرفي "Orion"
  • الاتصال GetSummary مع الحرفي "Orion" ونتيجة GetAddress
  • الاتصال Foo مع الحرفي 5 ونتيجة GetSummary
  • تعيين هذه القيمة إلى a

أنا أحب الجبار الردود.سأضيف أمرين:

  1. اليسار إلى اليمين لا يزال ساريا الأولى
  2. الداخلي إلى الخارجي للتأكد من أن جميع الحجج حلها قبل استدعاء الدالة

نقول لدينا المثال التالي:

a = Foo(5, GetSummary("Orion", GetAddress("Orion")),
           GetSummary("Chris", GetAddress("Chris")));

وهنا ترتيب التنفيذ:

  1. GetAddress("Orion")
  2. GetSummary("Orion", ...)
  3. GetAddress("Chris")
  4. GetSummary("Chris", ...)
  5. Foo(...)
  6. يعين a

أنا لا أستطيع أن أتكلم عن C#'s المتطلبات القانونية (على الرغم من أنني فعلت اختبار مماثل سبيل المثال باستخدام أحادية قبل كتابة هذا المنصب) ، ولكن هذا أمر مكفول في جاوة.

فقط للتأكد من اكتمالها (لأن هذا هو اللغة-الملحد الموضوع كذلك) ، هناك لغات مثل C و C++ ، حيث أمر غير مضمون ما لم يكن هناك تسلسل نقطة.المراجع: 1, 2.في الإجابة عن موضوع السؤال ، ومع ذلك ، && و || هي تسلسل النقاط في C++ (إلا طاقتها.انظر أيضا عصير البرتقال ممتاز الإجابة).لذلك بعض الأمثلة:

  • foo() && bar()
  • foo() & bar()

في && الحالة ، foo() مضمونة لتشغيل قبل bar() (إذا كان هذا الأخير هو تشغيل على الإطلاق) ، منذ && هو سلسلة نقطة.في & الحالة لا يضمن (في C و C++) ، بل bar() يمكن تشغيلها من قبل foo(), أو العكس بالعكس.

ما هو مثال جيد عند استخدام المعامل مشغل بدلا من "تماس منطقية"?

افترض أن لديك أعلام أقول على سمات الملف.افترض أن قمت بتعريف النحو 4 والكتابة 2 ، EXEC 1.في الثنائية،:

READ  0100  
WRITE 0010  
EXEC  0001

كل علم له واحد مجموعة بت و كل واحد فريد من نوعه.جميع مشغلي تتيح لك الجمع بين هذه العلامات:

flags = READ & EXEC; // value of flags is 0101

لقد سمعت في مكان ما أن القائمون على العمل إلى الوراء, ولكن أنا متأكد من مدى صحة هذا.

يمكنك استخدام & عندما تريد تحديدا لتقييم جميع الفرعية التعبيرات الأكثر احتمالا لأن لديهم آثار جانبية تريد ، على الرغم من أن النتيجة النهائية سوف تكون كاذبة وبالتالي يتم تنفيذ الخاص بك ثم جزء من إذا-البيان.

علما أن & و | تعمل لكل المختصة بالبت أقنعة والقيم المنطقية وليس فقط عمليات أحادي المعامل.انهم دعا أحادي المعامل ، ولكنها محددة لكل الأعداد الصحيحة و المنطقية أنواع البيانات في C#.

@csmba:

وطلب في متابعة السبب أو عندما يريد أي شخص استخدام بدلا من وأيضا (أو & بدلا من &&):هنا مثال:

if ( x.init() And y.init()) then
   x.process(y)
end 
y.doDance()

في هذه الحالة أريد أن الحرف الأول كل من X و Y.Y يجب تهيئة من أجل y.DoDance أن تكون قادرة على تنفيذ.ومع ذلك ، في init() وظيفة وأنا أفعل أيضا بعض الشيء الإضافي مثل التحقق من مأخذ مفتوحة ، وفقط إذا أن يعمل حسنا, كلا, يجب أن نمضي قدما ونفعل x.عملية(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

د لغة البرمجة يفعل من اليسار إلى اليمين التقييم مع الدائرة القصيرة و لا تسمح الزائد && و '||' المشغلين.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top