سؤال

في C# هل يضمن تقييم التعبيرات من اليسار إلى اليمين؟

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

myClass = GetClass();  
if (myClass == null || myClass.Property > 0)  
    continue;

هل هناك أي لغات لا تمتثل؟

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

المحلول

أنت في الواقع تشير إلى ميزة لغة تسمى "التعبيرات المنطقية ذات الدائرة القصيرة":

ما يعنيه هذا هو هذا:عندما لا يمكن أن تتغير نتيجة التعبير المنطقي بعد الآن، على سبيل المثال.عندما يكون من الواضح أن التعبير سيتم تقييمه إلى "صحيح" أو "خطأ" بغض النظر عن ذلك، لن يتم تقييم الأجزاء المتبقية من التعبير.

على سبيل المثال، تقوم لغة C# أو Java أو JavaScript بذلك، ويمكنك الاعتماد عليها في تلك اللغات (للإجابة على سؤالك).

في حالتك، إذا لم يكن MyClass فارغًا:

  • MyClass == null يقيم إلى كاذبة
  • نظرًا لأنه تعبير "أو"، فإن الجزء الثاني لا يزال بإمكانه تغيير النتيجة، لذلك يتم تقييمه
  • myClass.Property > 0 يحدد النتيجة النهائية

إذا كان MyClass فارغًا:

  • MyClass == null يقيم إلى صحيح
  • وبما أنه تعبير "أو"، فلا يهم ما يلي
  • لم يتم إجراء المزيد من التقييم، والنتيجة النهائية صحيحة

هناك لغات لا تقصر التعبيرات المنطقية.يعد VB الكلاسيكي مثالاً على ذلك، هنا سيتم تقييم "myClass.Property > 0" وينتج خطأ إذا كان MyClass فارغًا (يسمى "لا شيء" في VB).

نصائح أخرى

يوصف

وقصيرة الدائرة في القسم 7.11 من المواصفات C # 3.0:

<اقتباس فقرة>   

والعملية س || ذ يتوافق مع   العملية س | ذ، إلا أن y غير   تقييم فقط إذا كان x غير صحيح.

وهكذا نعم، وكنت على ما يرام.

وأما بالنسبة لغات أخرى - أنا لا أحب أن أتكلم عن جميع لغات. في VB.NET، يمكنك استخدام OrElse وAndAlso التي هي ذات دائرة قصيرة، ولكن سهل أو ووليست كذلك.

ولكن كن حذرا:

وإذا كان لديك شيء من هذا القبيل

وsprintf (BUF، "٪ ق٪ ق"، func1 (وفار)، func2 (وفار))؛

ومع sideeffects على فار، لا يتم تعريفه (في C، أنا لست متأكدا إذا تم تعريف ترتيب التقييم بلغات أخرى)، في أي ترتيب func1 () وfunc2 () يتم تنفيذها (ان ذلك يعتمد، ما هو ترتيب (اليمين أو اليسار) يتم وضع الحجج على المكدس وتقييمها من هناك.

من أجل تقييم يعتمد على المشغل، في هذه الحالة يتم تعريف منطقي أو (||) لتكون ما يسمى عادة <لأ href = "http://en.wikipedia.org/wiki/Short-circuit_evaluation" يختلط = "نوفولو noreferrer"> تلامس قصيرة ، لجعل يبني مثل هذا العمل.

وليس وو / أو المشغلين في لغات مثل آدا، فيجوال بيسك، وباسكال تفعل ماس كهربائى. أنها توفر شركات إضافية للسماح هذه الوظيفة، مثل "ثم" و "إلا" في ادا.

ولست متأكدا، هل أنت مهتم حقا في أمر أو في تقييم ماس كهربائى؟

وأنا لست متأكدا 100٪، ولكن بقدر ما أعرف ترتيب التقييم سوف يكون دائما هو نفسه في C # (وأفترض معظم إن لم يكن جميع لغات .NET). تقييم دائرة قصر يعمل كما هو موضح في الأجوبة السابقة.

ولكن، في C # يمكنك اختيار عدم ماس كهربائى باستخدام مشغلي بسيطة (وبدلا من &&). عادة تريد ماس كهربائى، ولكن قد يكون من الحالة التي تريد تنفيذ جميع التقييمات.

وبيثون ديه or وand مشغلي ماس كهربائى.

في جاوة وهاسكل && و || ماس كهربائي كذلك.

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

والواقع تقصير الدائرة هي جزء، ولكن عليك أيضا أن تعرف ما إذا كانت الضمانات لغة اليسار إلى اليمين تقييم تلك. على سبيل المثال C (ANSI، ISO، C99) لا نضمن من اليسار إلى اليمين التقييم. في نموذج التعليمات البرمجية سيكون من الممكن للتحقق من قيمة العقار قبل التحقق من وجود NULL أو القيام بالأمرين معا في وقت واحد ... معظم المجمعين لا، ولكن لا يوجد شيء منعه من القيام بذلك، ويجري متوافقة تماما مع المواصفات. حتى يقول لك لا لكتابة هذه المدونة لهذا السبب.

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