c# - لماذا أحصل على النتيجة الخاطئة عند تقييم التعبير؟




(4)

int[] a = {5, 6, 10}
int n = a.Max() + a.Sum() % 10;
Console.Write(n);

يطبع الكود 11 ، لكنني أتوقع 1 لأن 31٪ 10 = 1. هل يستطيع أحد أن يشرح لماذا يعطي الكود أعلاه إجابة مختلفة؟


المشكلة التي تواجهها هي بسبب أسبقية المشغل. % لها الأسبقية على + ، إذن ما تفعله فعليًا مع تعبيرك هو:

  1. الحصول على a.Max()
  2. الحصول على a.Sum() % 10
  3. أضفهم معًا

وبالتالي فإن النتيجة هي 10 + 1 ، وهو 11.

إذا كنت تريد أن تأخذ ما تبقى من الإضافة ، بدلاً من مجرد a.Sum() ، فأنت بحاجة إلى استخدام الأقواس: (a.Max() + a.Sum()) % 10 . هذا يغير التقييم إلى:

  1. الحصول على a.Max()
  2. الحصول على a.Sum()
  3. أضفهم معًا
  4. خذ الباقي بعد القسمة على 10

نتيجة ذلك هي 1.


المشكلة تتعلق بأسبقية المشغل.

في حين أن التعبير int n = a.Max() + a.Sum() % 10; تم التقييم،

بناءً على أسبقية المشغل ، يمكنك أن ترى أن العمليات المضافة تأتي بعد المضاعفة.

لإصلاح هذا ، أحد الحلول هو استخدام الأقواس كأقواس.

int n = (a.Max() + a.Sum()) % 10;

إذا كان بإمكانك أن ترى حسب الأسبقية في المشغل ، فتأكد من استخدام الأقواس من التعرف على المحتوى ضمن تعبير وتقييمه أولاً.

يمكنك فهم ذلك بناءً على https://docs.microsoft.com/en-us/cpp/c-language/precedence-and-order-of-evaluation?view=vs-2019 .

كما واقع الأمر أسبقية المشغل لجميع ج اللغات القائمة متشابهة.


جرب هذا. هذه مجرد قضية تجميع رياضية أساسية.

سيتم تقييم الضرب والقسمة آخر بعد + أو -

int[] a = {5, 6, 10};
int n = (a.Max() + a.Sum()) % 10;
Console.Write(n);

يجب أن تكون الإجابة 11 لأن:

int[] a = {5, 6, 10}
int n = a.Max() + a.Sum() % 10;
n = 10 + 21 % 10 ; 
n = 10 + 1; 
n = 11; 

إذا كنت تريد أن تكون 1 ، يجب عليك استخدام الأقواس المناسبة ، وعندها فقط سوف تعطي الأولوية للحسابات:

int[] a = {5, 6, 10}
int n = (a.Max() + a.Sum()) % 10;
n = (10 + 21) % 10 ; 
n = 31 % 10 ; 
n = 1; 



c#  

c#