كيف تؤثر المسافات المختلفة على المشغل الأحادي؟

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

  •  21-12-2019
  •  | 
  •  

سؤال

هل يمكن لأحد أن يشرح لي كيف تؤثر المسافات المختلفة على المشغل الأحادي؟

int i = 1;
int j = i+ + +i; // this will print j=2
int k = i++ +i; // this will print k=3
int l = i+++i; // this will print l=3
int m = i++++i; // compile time error

.

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

المحلول

أولاً، دعنا نقسم هذا إلى ثلاث حالات منفصلة لا يمكن أن تتفاعل:

int i = 1;
System.out.println(i+ + +i); // 2

int j = 1;
System.out.println(j++ +j); // 3

int k = 1;
System.out.println(k+++k); // 3

الآن دعونا نعيد كتابتها باستخدام الأقواس:

int i = 1;
System.out.println(i + (+(+i)));

int j = 1;
System.out.println((j++) + j);

int k = 1;
System.out.println((k++) + k);

العملية الأولى

نحن هنا لا أستطيع أن تستخدم عوامل التشغيل البادئة أو postfix ++، حيث ليس لدينا رمز مميز لها ++ في أى مكان.بدلاً من ذلك، لدينا عامل ثنائي + وعاملان أحاديان +.

العملية الثانية

هذا بسيط:إنه كما يقرأ إلى حد كبير، عامل تشغيل postfix ++ متبوعًا بعامل ثنائي + (وليس عامل التشغيل الأحادي + الذي +j قد يعني خلاف ذلك).

العملية الثالثة

يتم تحليل السطر الأخير كما (k++) + k بدلا من k + (++k).كلاهما سوف يعطي في الواقع نفس الإجابة هذا الموقف، ولكن يمكننا إثبات أيهما باستخدام متغيرين مختلفين بدلاً من ذلك:

int k1 = 1;
int k2 = 1;
System.out.println(k1+++k2); // Prints 2
System.out.println(k1); // Prints 2
System.out.println(k2); // Prints 1

كما ترون، هو k1 لقد تم زيادتها بدلا من k2.

السبب في أن k+++k يتم تحليلها كرموز k, ++, +, k يرجع إلى القسم 3.2 من JLS, ، الذي يتضمن:

يتم استخدام أطول ترجمة ممكنة في كل خطوة، حتى لو كانت النتيجة لا تؤدي في النهاية إلى إنشاء برنامج صحيح بينما قد تؤدي الترجمة المعجمية الأخرى إلى ذلك.

العملية الرابعة (فشل الترجمة)

يتم توزيع نفس قاعدة "أطول ترجمة ممكنة". i++++i مثل i, ++ ,++, i وهو ليس تعبيرًا صالحًا (لأن نتيجة ++ العملية قيمة وليست متغيرة).

نصائح أخرى

+ هو المشغل، و ++ هو المشغل، ولكن + + ليس - + + يتم تفسيره على أنه اثنان +س، وليس واحدا ++.لذا فإن المساحة تفرض تفسير التعليمات البرمجية الخاصة بك بشكل مختلف.

+ هو عامل ثنائي يضيف رقمين وعامل أحادي لا يغير رقمًا (موجود فقط من أجل الاتساق مع العامل الأحادي) - المشغل أو العامل).

إذا استخدمنا add بدلا من الثنائي +, no-change بدلا من الأحادية +, ، و increment بدلاً من ++ ثم قد يكون أكثر وضوحا.

int j=i+ + +i يصبح int j = i add no-change no-change i;.
int k=i++ +i; يصبح int k=i increment add i;.
أظن int k = i+++i; يصبح أيضا int k = i increment add i; لكنني لم أتحقق من ذلك باستخدام مواصفات اللغة.

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