سؤال

كيف المشغل فاصلة العمل في C++?

فعلى سبيل المثال ، إذا كنت تفعل:

a = b, c;  

لا ينتهي يعادل b أو c ؟

(نعم, أعلم أن هذا هو سهل الاختبار فقط توثيق هنا لشخص ما أن تجد الإجابة بسرعة.)

تحديث: هذا السؤال قد يتعرض فارق بسيط عند استخدام الفاصلة المشغل.فقط لتوثيق هذا:

a = b, c;    // a is set to the value of b!

a = (b, c);  // a is set to the value of c!

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

a = b;
c = d;

تحولت إلى

a = b,    //  <-  Note comma typo!
c = d;
هل كانت مفيدة؟

المحلول

سيكون مساويا b.

فاصلة المشغل لديه أولوية أقل من الواجب.

نصائح أخرى

العناية لاحظ أن الفاصلة المشغل قد يكون زائد في C++.الفعلية السلوك وبالتالي قد تكون مختلفة جدا عن المتوقع.

وكمثال على ذلك ، دفعة.روح يستخدم المشغل فاصلة تماما بذكاء لتنفيذ قائمة المهيآت عن الرمز الجداول.مما يجعل بناء الجملة التالي الممكن والمجدي:

keywords = "and", "or", "not", "xor";

لاحظ أنه نظرا مشغل الأسبقية ، رمز (عمدا!) مطابقة

(((keywords = "and"), "or"), "not"), "xor";

وهي أول مشغل يطلق عليه هو keywords.operator =("and") والتي ترجع الوكيل الكائن الذي المتبقية operator,s الاحتجاج:

keywords.operator =("and").operator ,("or").operator ,("not").operator ,("xor");

فاصلة المشغل له أدنى الأسبقية من C/C++ المشغلين.لذلك هو دائما آخر من ربط تعبير, معنى هذا:

a = b, c;

يعادل:

(a = b), c;

حقيقة أخرى مثيرة للاهتمام هو أن المشغل فاصلة يدخل تسلسل نقطة.وهذا يعني أن عبارة:

a+b, c(), d

ويضمن أن يكون لديها ثلاثة subexpressions (أ+ب, ج() و d) تقييم في النظام.وهذا أمر مهم إذا كان لديهم آثار جانبية.عادة المجمعين يسمح لتقييم subexpressions في كل ما أمر يجدونه مناسبا ؛ على سبيل المثال ، في استدعاء دالة:

someFunc(arg1, arg2, arg3)

الحجج التي يمكن تقييمها في أمر تعسفي.علما أن الفواصل في وظيفة الاتصال هي لا المشغلين ، فهي فواصل.

فاصلة المشغل:

  • لديه أدنى الأسبقية
  • هو اليسار النقابي

افتراضي إصدار فاصلة المشغل تعريف لجميع أنواع (المدمج في العرف) ، وهي تعمل على النحو التالي - نظرا exprA , exprB:

  • exprA يتم تقييم
  • نتيجة exprA يتم تجاهل
  • exprB يتم تقييم
  • نتيجة exprB يتم إرجاع نتيجة كل التعبير

مع معظم مشغلي مترجم يسمح لاختيار ترتيب التنفيذ وحتى أنه مطلوب لتخطي التنفيذ على الإطلاق إذا كان لا يؤثر على النتيجة النهائية (مثل false && foo() سيتم تخطي الدعوة إلى foo).لكن هذا ليس هو الحال بالنسبة فاصلة مشغل الخطوات المذكورة أعلاه سوف يحدث دائما*.

في الواقع الافتراضي فاصلة المشغل يعمل تقريبا بنفس طريقة منقوطة.الفرق هو أن تعبيرين مفصولة بفاصلة منقوطة شكل بيانين منفصلين ، في حين فاصلة-الفصل يحتفظ كل واحد التعبير.هذا هو السبب فاصلة المشغل يستخدم أحيانا في السيناريوهات التالية:

  • ج جملة يتطلب واحد التعبير, لا بيان.على سبيل المثالفي if( HERE )
  • ج جملة يتطلب بيان واحد ، وليس أكثر من ذلك ، على سبيل المثالفي تهيئة for حلقة for ( HERE ; ; )
  • عندما كنت ترغب في تخطي الأقواس المتعرجة والحفاظ على بيان واحد: if (foo) HERE ; (من فضلك لا تفعل ذلك أنها قبيحة!)

عندما البيان ليس تعبير ، منقوطة لا يمكن استبداله فاصلة.على سبيل المثال هذه هي غير مسموح بها:

  • (foo, if (foo) bar) (if ليس تعبير)
  • int x, int y (متغير الإعلان ليس تعبير)

في حال لدينا:

  • a=b, c;, أي ما يعادل a=b; c;, على افتراض أن a هو من النوع الذي لا تفرط الفاصلة المشغل.
  • a = b, c = d; أي ما يعادل a=b; c=d;, على افتراض أن a هو من النوع الذي لا تفرط الفاصلة المشغل.

ملاحظة أن ليس كل فاصلة في الواقع فاصلة المشغل.بعض الفواصل التي لها معنى مختلف تماما:

  • int a, b; --- متغير إعلان قائمة مفصولة بفواصل ، ولكن هذه ليست فاصلة المشغلين
  • int a=5, b=3; --- هذا هو أيضا مفصولة بفواصل متغير إعلان قائمة
  • foo(x,y) --- مفصولة بفواصل الحجة قائمة.في الواقع ، x و y يمكن تقييمها في أي النظام!
  • FOO(x,y) --- مفصولة بفواصل الكلي الحجة قائمة
  • foo<a,b> --- مفصولة بفواصل قالب الحجة قائمة
  • int foo(int a, int b) --- مفصولة بفواصل قائمة المعلمة
  • Foo::Foo() : a(5), b(3) {} --- مفصولة بفواصل مهيئ قائمة في منشئ الفئة

* هذا ليس صحيحا تماما إذا قمت بتطبيق تحسينات.إذا كان المترجم تدرك أن بعض قطعة من التعليمات البرمجية لها اي تأثير على بقية, فإنه سيتم إزالة البيانات غير الضرورية.

مزيد من القراءة: http://en.wikipedia.org/wiki/Comma_operator

قيمة a سوف يكون b, ولكن قيمة التعبير سوف يكون c.هذا هو, في

d = (a = b, c);

أن يكون مساويا b, ، d ستكون مساوية c.

ب قيمة سيتم تعيينه.لن يحدث شيء ج

قيمة سوف يكون مساويا ب ، منذ فاصلة المشغل لديه أولوية أقل من عامل التعيين.

نعم فاصلة المشغل منخفضة الأسبقية من عامل التعيين

#include<stdio.h>
int main()
{
          int i;
          i = (1,2,3);
          printf("i:%d\n",i);
          return 0;
}

الإخراج :i=3
لأن فاصلة المشغل دائما العودة أقصى اليمين القيمة.
في حالة فاصلة المشغل مع عامل التعيين:

 int main()
{
      int i;
      i = 1,2,3;
      printf("i:%d\n",i);
      return 0;
}

Ouput:i=1
كما نعلم فاصلة المشغل لديه أقل الأسبقية من المهمة.....

أول الأشياء أولا: فاصلة هي في الواقع ليست المشغل, المترجم هو مجرد عربون الذي يحصل معنى في سياق مع الرموز الأخرى.

ماذا يعني هذا و لماذا ؟

مثال 1:

لفهم الفرق بين معنى نفس المنوال في سياق مختلف ونحن نلقي نظرة على هذا المثال:

class Example {
   Foo<int, char*> ContentA;
}

عادة ما يكون C++ للمبتدئين أعتقد أن هذا التعبير يمكن أن/أن نقارن الأشياء وإنما هو absolutly الخطأ ، ومعنى <, > و , الرموز اعتمد على سياق الاستخدام.

التفسير الصحيح من المثال أعلاه هو بالطبع أنه هو instatiation من قالب.

مثال 2:

عندما نكتب عادة حلقة مع أكثر من واحد initialisation متغير و/أو واحد أو أكثر التعبيرات التي ينبغي القيام به بعد كل تكرار للحلقة نستخدم فاصلة أيضا:

for(a=5,b=0;a<42;a++,b--)
   ...

معنى الفاصلة يعتمد على سياق الاستخدام ، ومن هنا سياق for البناء.

ماذا فاصلة في السياق تعني في الواقع ؟

إلى تعقيد الأمر أكثر (كما هو الحال دائما في C++) المشغل فاصلة يمكن أن يكون في حد ذاته طاقتها (بفضل كونراد رودولف لافتا إلى أن).

أن أعود إلى السؤال ، رمز

a = b, c;

يعني المترجم شيئا مثل

(a = b), c;

لأن الأولوية من = المميز/مشغل أعلى من الأولوية , رمزية.

و هذا تفسيرها في سياق مثل

a = b;
c;

(لاحظ أن التفسير يعتمد على السياق ، ومن هنا فإنه لا وظيفة/استدعاء الأسلوب أو قالب instatiation.)

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