C # مشروط و (&&) أو (||) الأسبقية
-
20-09-2019 - |
سؤال
ندخل في حجج الترميز غير الضرورية في عملي طوال الوقت. لقد سألت اليوم عما إذا كانت مشروطة و (&&) أو (||) كان لها أسبقية أعلى. أصر أحد زملائني على أن لديهم نفس الأسبقية، كان لدي شكوك، لذلك نظرت إليه.
وفقا ل 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 ومعرفة ما يحدث مع دائرة قصيرة.