كيف يمكنني وضع اثنين زيادة البيانات في C++ 'ل' الحلقة ؟

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

  •  22-07-2019
  •  | 
  •  

سؤال

أود أن الزيادة اثنين من المتغيرات في forحلقة الحالة بدلا من واحدة.

حتى شيء من هذا القبيل:

for (int i = 0; i != 5; ++i and ++j) 
    do_something(i, j);

ما هي الجملة من أجل هذا ؟

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

المحلول

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

for(int i = 0; i != 5; ++i,++j) 
    do_something(i,j);

ولكن هل حقا مشغل فاصلة؟

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

int i=0;
int a=5;
int x=0;

for(i; i<5; x=i++,a++){
    printf("i=%d a=%d x=%d\n",i,a,x);
}

وكنت أتوقع س لالتقاط القيمة الأصلية لذلك، لذلك ينبغي أن يكون عرض 5،6،7 .. ل x. حصل ما كان هذا

i=0 a=5 x=0
i=1 a=6 x=0
i=2 a=7 x=1
i=3 a=8 x=2
i=4 a=9 x=3

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

int main(){
    int i=0;
    int a=5;
    int x=0;

    for(i=0; i<5; x=(i++,a++)){
        printf("i=%d a=%d x=%d\n",i,a,x);
    }
}

i=0 a=5 x=0
i=1 a=6 x=5
i=2 a=7 x=6
i=3 a=8 x=7
i=4 a=9 x=8

في البداية اعتقدت أن هذا أظهر أنه لم يكن يتصرف كمشغل فاصلة في كل شيء، ولكن كما اتضح، وهذا هو مجرد مسألة الأسبقية - المشغل فاصلة له في ادنى حد ممكن الأسبقية ، وبالتالي فإن التعبير س = ط ++، يتم تحليل و++ بشكل فعال كما (س = ط ++)، و++

وشكرا لجميع التعليقات، وكانت تجربة التعلم مثيرة للاهتمام، ولقد تم استخدام C لسنوات عديدة!

نصائح أخرى

وهذه محاولة

for(int i = 0; i != 5; ++i, ++j)
    do_something(i,j);

وحاول أن لا تفعل ذلك!

من <لأ href = "https://web.archive.org/web/20120509225531/http://www2.research.att.com/~bs/JSF-AV-rules.pdf" يختلط = "نوفولو noreferrer "> http://www.research.att.com/~bs/JSF-AV-rules.pdf :

<اقتباس فقرة>   

وAV القاعدة 199
  فإن التعبير الزيادة في حلقة for أداء أي إجراء سوى تغيير واحد   معلمة حلقة إلى القيمة التالية للحلقة.

     

والأساس المنطقي: المقروئية.

for (int i = 0; i != 5; ++i, ++j) 
    do_something(i, j);

لقد جئت إلى هنا أذكر نفسي كيفية رمز في الثانية مؤشر إلى زيادة بند من حلقة ، والتي عرفت يمكن أن يتم أساسا من مراقبة ذلك في عينة أنني أدرجت في مشروع آخر ، وهذا مكتوب في C++.

اليوم أنا أعمل في C#, ولكن شعرت على يقين من أنه سوف تطيع نفس القواعد في هذا الصدد ، لأن هذا البيان هو واحد من أقدم هياكل المراقبة في كل من البرمجة.الحمد لله, كنت قد أمضى مؤخرا عدة أيام بالضبط توثيق السلوك من حلقة في واحد من أقدم برامج C, وسرعان ما أدركت أن تلك الدراسات عقد الدروس التي تطبق اليوم C# المشكلة ، وبخاصة سلوك الثانية مؤشر متغير.

للغافلين ، وفيما يلي ملخص من ملاحظاتي.كل شيء رأيته يحدث اليوم ، بعناية مراقبة المتغيرات في الإطار المحلي ، وأكد توقعي أن C# على بيان يتصرف تماما مثل C أو C++ البيان.

  1. المرة الأولى لحلقة ينفذ الزيادة في البند (3 ثلاثة) هو تخطي.في Visual C و C++ ، الزيادة يتم إنشاء ثلاثة تعليمات الجهاز في منتصف الكتلة التي تنفذ حلقة ، بحيث الأولي تمر يعمل رمز التهيئة مرة واحدة فقط ، ثم يقفز على زيادة كتلة لتنفيذ انتهاء الاختبار.هذا وتنفذ الميزة التي لحلقة ينفذ صفر أو أكثر من مرة ، اعتمادا على الدولة من مؤشر والحد من المتغيرات.
  2. إذا كان الجسم من الحلقة ، البيان الأخير هو القفز إلى الأول من الثلاثة زيادة على التعليمات التي تم تخطيها من خلال التكرار الأول.بعد هذه تنفيذ ، مراقبة تقع بشكل طبيعي في حد اختبار التعليمات البرمجية التي تنفذ منتصف شرط.نتائج هذا الاختبار يحدد ما إذا كان الجسم على الحلقة ، أو ما إذا كانت الرقابة على عمليات نقل الأسلحة إلى التعليمة التالية الماضي قفزة في الجزء السفلي من نطاقه.
  3. منذ مراقبة التحويلات من أسفل حلقة كتلة إلى زيادة كتلة مؤشر متغير يتم زيادة قبل الاختبار يتم تنفيذها.ليس فقط هذا السلوك يفسر لماذا يجب أن التعليمات البرمجية الخاصة بك الحد من أحكام الطريقة التي تعلمت ، ولكنه يؤثر على أي الثانوية الاضافة التي تضيفها عن طريق المشغل فاصلة, لأنه يصبح جزء من الفقرة الثالثة.ومن ثم فمن لم يتغير في التكرار الأول, ولكن كان على التكرار الأخير الذي لم ينفذ الجسم.

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

وأنا أتفق مع squelart. تزايد متغيرين هو الشوائب عرضة، وخاصة إذا كنت اختبار فقط واحد منهم.

وهذا هو السبيل للقراءة للقيام بذلك:

for(int i = 0; i < 5; ++i) {
    ++j;
    do_something(i, j);
}
والمقصود

والحلقات For في الحالات التي تدير حلقة الخاص بك على واحد زيادة / خفض متغير. للحصول على أي متغير آخر، تغييره في الحلقة.

إذا كنت تحتاج j أن تكون مرتبطة i، لماذا لا يترك المتغير الأصلي كما هو وإضافة i؟

for(int i = 0; i < 5; ++i) {
    do_something(i,a+i);
}

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

int main(){
    int i=0;
    int a=0;
    for(i;i<5;i++,a++){
        printf("%d %d\n",a,i);
    } 
}

واستخدام الرياضيات. إذا العمليتين يعتمد رياضيا على التكرار حلقة، لماذا لا تفعل الرياضيات؟

int i, j;//That have some meaningful values in them?
for( int counter = 0; counter < count_max; ++counter )
    do_something (counter+i, counter+j);

وأو، مشيرا على وجه التحديد إلى المثال OP و:

for(int i = 0; i != 5; ++i)
    do_something(i, j+i);

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

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