السلام عليكم
مالفرق بين الحلقات الثلاث في لغة جافا for - while -do while
ومتي يكون استخدام احدها افضل من غيرها
ستجدني ذكرت في تعليقي
بالطبع يمكن تمثيل positive kleene بال kleene star عن طريق اضافة تنفيذ مبدئي لضمان التنفيذ مرة واحدة على الاقل مثلما ستضطر في استخدامك للwhile بدلا من do-while لتكرار الكود ووضعه مرتين، مرة قبل الحلقة التكرارية ومرة داخلها
تعليقي لا ينفي إمكانية التبديل بينهم لكن في (بعض الحالات) يحتاج ذلك لتكرار الكود، جرب المثال الذي ذكرته لتفهم حتمية وجود التكرار في بعض الحالات
تعليقي لا ينفي إمكانية التبديل بينهم لكن في (بعض الحالات) يحتاج ذلك لتكرار الكود، جرب المثال الذي ذكرته لتفهم حتمية وجود التكرار في بعض الحالات
المعذرة لم انتبه لكلامك هذا
لكن حتى في هذه ليس بالضروة تكرار الكود
فبدلاً من تكرار الكود يمكنك (كما ذكرت سابقا) أن تجعل شرط التكرار صحيح بداية وحينها سيصبح الوايل لوب مثل الدو وايل
مثال ذلك
هذا الكود
int x=1;
do
{
System.out.println("do-while loop");
}while(x==0);
هنا طبعا سيتم تنفيذ ما بداخل الكود مرة واحدة لأن شرط التكرار خاطئ والدو-وايل ينفذ ثم يفحص الشرط
فللحصول على نفس النتيجة بالوايل بدلاً من تكرار ما بداخل اللوب كما اقترحت يمكن ببساطة التلاعب بشرط اللوب فنجعله في البداية سليم ليتحقق تنفيذ ما بداخل اللوب ثم يكون خاطئ لنضمن عدم التكرار بعد ذلك
int x=0;
while(x==0)
{
System.out.println("while loop");
x=1;
}
بكلمات أخرى
الفرق الوحيد في النتيجة بين الوايل والدو وايل يظهر فقط وفقط اذا كان شرط التكرار خاطئ من البداية
حينها بسبب الية ترتيب التنفيذ في الدو وايل سيتم يتنفيذ ما بداخل الحلقة مرة واحدة بينما في الوايل بسبب آلية ترتيب التنفيذ لن يتم تنفيذ ما بداخل الحلقة
لكن ببساطة بمجرد أن نجعل شرط الوايل سليم في البداية ثم يصبح غير سليم بعد ذلك حينها سيصبح الوايل نفس الدو وايل
مثالك يعتمد على التلاعب وكما ذكرت في التعليق الأول
كونك تستطيع استخدام for و while بدلا من do-while في بعض الحالات باستخدام (خطوات اضافية) فهذا لا ينفي وجود اختلاف جوهري بينهم يرجع (للحالات المصممة لها) وقت تصميم اللغة
من حيث الأصل تحويل do ل while يتم بهذا الشكل
do{
loop_body
}while(not_valid_condition)
====>
loop_body
while(not_valid_condition){
loop_body
}
والأفضل في هذه الحالات هو استخدام do بدلا من استخدام خطوات اضافية مثل التلاعب أو تكرار الكود
الفرق الوحيد في النتيجة بين الوايل والدو وايل يظهر فقط وفقط اذا كان شرط التكرار خاطئ من البداية
إذا كنت تقصد ناتج التنفيذ فنعم صحيح، أما إذا كان الناتج المترجم (اسمبلي) فلا ليس صحيح تماما do تحتوي علي conditional jump فقط أما while فتحتوي على conditional jump و unconditional jump وهو بالطبع فارق غير مهم للمطورين الأن فمع قيام الكمبيلر بعملية ال optimization سيقوم بloop unrolling . ولكنه يظل فرق مهم لفهم كيف تحدث الاشياء على أدني مستوي
يبدوا أننا متفقين وإنما الاختلاف بيينا لفظي
أعلم بوجود فروق بين الحلقات الثلاث
لكن هذه الفروق أنا أسميها فروق هامشية لا جوهرية على اعتبار أنه يمكن التبديل بين اللوبات مع الحصول على نفس النتيجة مع مراعاة أن السائل هنا لا يهمه تفاصيل الاسمبلي أو البايت كود الناتجة والظن أيضاً أن السائل يسأل عن الفروق التي تمايز بين نتيجة اختيار اللوبات
فأردت تنبيهه أنه لا تمايز ويمكنه الحصول على نفس النتيجة بأي لوب
بينما أنت تسمي هذه الفروق بالجوهرية لاعتبارات أخرى
ففي حقيقة الأمر نحن متفقين وإن كنا نستخدم الفاظا مختلفة
احترامي لك
وشكراً لاضافاتك المفيدة
محبتي
التعليقات