هل يتم ترقية المعاملات داخل تعبير إلى أنواع أكبر وفقًا للقواعد التالية؟

StackOverflow https://stackoverflow.com/questions/3080597

سؤال

إذا كان التعبير الرقمي يحتوي على معاملات (ثوابت ومتغيرات) من أنواع رقمية مختلفة ، يتم ترقية المعاملات إلى أنواع أكبر وفقًا للقواعد التالية:

  1. إذا كانت المعاملات من أنواع byte, sbyte, char, short, ushort, ، يتم تحويلها إلى int يكتب
  2. إذا كان أحد المعاملات int, ، ثم يتم تحويل جميع المعاملات إلى int
  3. إذا كان التعبير يحتوي أيضًا على معاملات الأنواع uint و int, ، ثم يتم تحويل جميع المعاملات إلى long
  4. إذا كان أحد المعاملات long, ، ثم يتم تحويل جميع المعاملات إلى long
  5. إذا كان التعبير يحتوي على معاملات من النوع ulong و long, ، ثم يتم تحويل المعاملات إلى float
  6. إذا كان أحد المعاملات float, ، ثم يتم تحويل جميع المعاملات إلى float
  7. إذا كان أحد المعاملات double, ، ثم يتم تحويل جميع المعاملات إلى double

على افتراض أن التعبيرات الرقمية تحتوي على معاملات من أنواع مختلفة ، هل سيتم تحويل جميع المعاملات أولاً إلى نوع رقمي واحد ، وعندها فقط سيحاول وقت التشغيل حساب النتيجة؟ على سبيل المثال ، إذا كانت المتغيرات b1 و b2 هم من byte اكتب ، بينما i1 هو من int النوع ، سوف b1 و B2 get تم تحويلها إلى int قبل الحوسبة (b1+b2):

int i2=(b1+b2)+i1
هل كانت مفيدة؟

المحلول

الأقواس ذات الأسبقية أعلى من +, ، وبالتالي فإن التحويل سيحدث عادة بعد b1 و b2 قد أضيف. ومع ذلك ، فإن + المشغل أو العامل ليس لديه تحميل زائد إلى عن على byteS ، لذلك byteيجب أولاً ترقية S إلى intس.

قراءة متعمقة:

نصائح أخرى

قواعدك لديها بعض عناصر الحقائق ، ولكنها غير دقيقة من الناحية الفنية.

فيما يلي مقتطفات ذات صلة من مواصفات لغة C#

7.2.6.2 الترقيات الرقمية الثنائية

يحدث الترويج الرقمي الثنائي لمعاملات المحددة مسبقًا +, , *, /, %, &, |, ^, ==, !=, >, <, >=, ، و <= مشغلي ثنائي. يحول الترويج الرقمي الثنائي ضمنيًا كلا المعاملين إلى نوع مشترك والذي ، في حالة المشغلين غير العلميين ، يصبح أيضًا نوع النتيجة للعملية. يتكون الترويج الرقمي الثنائي من تطبيق القواعد التالية ، بالترتيب الذي يظهرون هنا:

  • إذا كان أي من المعامل من النوع decimal, ، يتم تحويل المعامل الآخر إلى الكتابة decimal, ، أو يحدث خطأ في وقت الترجمة إذا كان المعامل الآخر من النوع float أو double.
  • خلاف ذلك ، إذا كان أي من المعامل من النوع double, ، يتم تحويل المعامل الآخر إلى الكتابة double.
  • خلاف ذلك ، إذا كان أي من المعامل من النوع float, ، يتم تحويل المعامل الآخر إلى الكتابة float.
  • خلاف ذلك ، إذا كان أي من المعامل من النوع ulong, ، يتم تحويل المعامل الآخر إلى الكتابة ulong, ، أو يحدث خطأ في وقت الترجمة إذا كان المعامل الآخر من النوع sbyte, short, int, ، أو long.
  • خلاف ذلك ، إذا كان أي من المعامل من النوع long, ، يتم تحويل المعامل الآخر إلى الكتابة long.
  • خلاف ذلك ، إذا كان أي من المعامل من النوع uint والمعامل الآخر من النوع sbyte, short, ، أو int, ، يتم تحويل كلا المعاملين إلى النوع long.
  • خلاف ذلك ، إذا كان أي من المعامل من النوع uint, ، يتم تحويل المعامل الآخر إلى الكتابة uint.
  • خلاف ذلك ، يتم تحويل كلا المعاملين إلى النوع int.

int i2=(b1+b2)+i1

حسب المواصفات أعلاه ، نعم ، byte b1, b2 تخضع لترويج رقمي ثنائي ل int للمشغل الثنائي +.

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