سؤال

ندخل في حجج الترميز غير الضرورية في عملي طوال الوقت. لقد سألت اليوم عما إذا كانت مشروطة و (&&) أو (||) كان لها أسبقية أعلى. أصر أحد زملائني على أن لديهم نفس الأسبقية، كان لدي شكوك، لذلك نظرت إليه.

وفقا ل MSDN و (&&) لديه أسبقية أعلى من أو (||). ولكن، هل يمكنك إثبات ذلك في زميل العمل المتشكك؟

http://msdn.microsoft.com/en-us/library/aa691323(VS.71).aspx.

bool result = false || true && false; // --> false
// is the same result as
bool result = (false || true) && false; // --> false
// even though I know that the first statement is evaluated as 
bool result = false || (true && false); // --> false

لذلك سؤالي هو كيف تثبت مع التعليمات البرمجية التي و (&&) لها أسبقية أعلى ذلك أو (||)؟ إذا كانت إجابتك لا تهم، فلماذا مبنية بهذه الطريقة باللغة؟

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

المحلول

تغيير أول خطأ صحيح. أعلم أنه يبدو غبيا أن يكون لديك (صحيح || صحيح) ولكنه يثبت وجهة نظرك.

bool result = true || true && false;   // --> true 
     result = (true || true) && false; // --> false
     result = true || (true && false); // --> true

نصائح أخرى

إذا كنت ترغب حقا في الخروج، فحاول الخروج:

bool result = True() | False() && False();

Console.WriteLine("-----");
Console.WriteLine(result);

static bool True()
{
    Console.WriteLine(true);
    return true;
}

static bool False()
{
    Console.WriteLine(false);
    return false;
}

هذا سوف يطبع:

True
False
False
-----
False

تعديل:

ردا على التعليق:

في C #، | هو مشغل منطقي يؤدي نفس المنطق المنطقي كما ||, ، ولكن لا ماس كهربائى. أيضا في ج #، | لدى المشغل إحساس أعلى من كليهما || و &&.

عن طريق طباعة القيم، يمكنك أن ترى أنه إذا كنت تستخدم النموذجية || المشغل، فقط الأول True سيتم طباعتها - تليها نتيجة التعبير الذي كان True ايضا.

ولكن بسبب الأسبقية العليا من |, ، ال true | false يتم تقييمه أولا (مما أدى إلى true) و من ثم هذه النتيجة هي &&إد مع false يثمر false.

لم أكن أحاول إظهار ترتيب التقييم، فقط حقيقة أن النصف الأيمن من | تم تقييم الفترة عندما لا تكون عادة :)

لن تحصل على هذا ما أنت بعد؟ أو ربما أنا أفتقد شيئا ...

bool result = true || false && false;

أنت لا تثبت ذلك برمز ولكن مع المنطق. وهو الضرب المنطقي في حين أن إضافة منطقية. الآن أي واحد لديه الأسبقية العليا؟

خطأ || حقيقي حقيقي

الغلة: صحيح

خطأ && صحيح || حقيقي

الغلة: صحيح

لا يمكنك إظهار النتيجة النهائية فقط عندما تكون تعبيراتك المنطقية قصيرة الدائرة. إليك مقتطف يستقر قضيتك.

إنه يعتمد على التنفيذ & | المشغلون المستخدمة من قبل && و ||، كما هو مذكور في MSDN 7.11 المشغلين المنطقيين الشرطي

public static void Test()
{
    B t = new B(true);
    B f = new B(false);

    B result = f || t && f;

    Console.WriteLine("-----");
    Console.WriteLine(result);
}

public class B {
    bool val;
    public B(bool val) { this.val = val; }
    public static bool operator true(B b) { return b.val; }
    public static bool operator false(B b) { return !b.val; }
    public static B operator &(B lhs, B rhs) { 
        Console.WriteLine(lhs.ToString() + " & " + rhs.ToString());
        return new B(lhs.val & rhs.val); 
    }
    public static B operator |(B lhs, B rhs) { 
        Console.WriteLine(lhs.ToString() + " | " + rhs.ToString());
        return new B(lhs.val | rhs.val); 
    }
    public override string ToString() { 
        return val.ToString(); 
    }
}

يجب أن يظهر الإخراج أن && يتم تقييمه أولا قبل ||.

True & False
False | False
-----
False

للحصول على متعة إضافية، جربه مع النتيجة = T || T && f ومعرفة ما يحدث مع دائرة قصيرة.

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