سؤال

أنا أعمل حاليا من خلال التمارين في لغة البرمجة C'.هنا هو واحد من الحلول:

int c;

while ((c=getchar()) != EOF) {

if (c == ' ') {

    while ((c = getchar()) == ' ')

    {}  // do nothing?

    putchar(' ');

}

putchar(c);

}

وجدت بعض الحلول هنا التي تختلف تماما الألغام واستخدام إضافي متغير لتتبع ما يحدث بينما أنا مجرد استخدام حلقة في حين أن القفز من خلال جميع المساحات.حل بلدي يشعر قليلا فوضوي ، كما يبدو قليلا hackish أن يكون حلقة في حين لا شيء بين الأقواس المتعرجة.كنت أتساءل إذا كان هناك أي أسباب وجيهة لا تفعل هذا ؟ شكرا على أي نصيحة :-)

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

المحلول

وليس على الإطلاق - أعتقد أنك سوف تجد تفعل شيئا حلقات مثل هذه في K & R، لذلك أن حوالي الرسمي كما يحصل

.

وانها مسألة تفضيل شخصي، لكنني أفضل لي لا تفعل شيئا حلقات من هذا القبيل:

while(something());

ويفضل آخرون منقوطة للذهاب على سطر منفصل، لتعزز حقيقة أنها حلقة:

while(something())
  ;

وآخرون يفضلون استخدام الأقواس مع أي شيء في الداخل، كما فعلت:

while(something())
{
}

والأمر كله صحيح - عليك فقط لاختيار النمط الذي تريد والعصا معه

نصائح أخرى

وسؤالك "هل يستخدم كتلة في حين أن تفعل شيئا سيئا؟" ويمكن أيضا أن تكون الإجابة من حيث إضاعة دورات وحدة المعالجة المركزية. في هذه الحالة كان الجواب "لا"، منذ ذلك الحين، فإن العملية سوف ينام في الوقت الذي ينتظر المستخدم لإدخال الحرف.

وهذه العملية سوف يستيقظ إلا بعد حرف الإدخال. ثم سيحدث الاختبار وإذا تجاوز الاختبار، أي ج == ''، فإن عملية الذهاب الى النوم مرة أخرى حتى يتم إدخال الحرف التالي. هذا يكرر حتى يتم إدخال الطابع غير الفضائية.

وأعتقد أنه من المقبول تماما.

وأود أن إما كتابة ما يلي:

//skip all spaces
while ((c = getchar()) == ' ') {} 

لتجعل من الواضح أن هذا سطر واحد من التعليمات البرمجية يفعل شيئا واحدا.

وأو أود أن أكتب مثل هذا:

while ((c = getchar()) == ' ') {
    //no processing required for spaces
}

وبحيث يطابق ما تبقى من شكل كود الخاص بك.

وشخصيا، وأنا لست من محبي

while ((c = getchar()) == ' ');

والشكل. وأعتقد أنه هو من السهل التغاضي عن منقوطة.

وكذلك إذا كنت حقا لا أحب الأقواس الفارغة، هل يمكن أن ريفاكتور أن الحلقة الداخلية إلى

while (c == ' ') {c = getchar();}

وهذا يكلف مقارنة إضافية واحدة على الرغم من ذلك افعل حين أن الحلقة ستكون أفضل.

وأنا لا أعتقد أن هذا الإجراء هو، ولكن التنسيق الخاص بك هو غريب جدا. لا يوجد شيء خاطئ مع:

/* Eat spaces */
while ((c = getchar()) == ' ');

و(أي، تشير إلى هناك قصد ليست هيئة)

وأود أن صالح:

while ((c = getchar()) == ' ') /* Eat spaces */;

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

وعلى الرغم الهيئات حلقة غير موجودة مقبولة تماما أنه ينبغي أن يكون <م> VERY واضح أنه مقصود.

A while الذي لا يفعل شيئا ربما هو شيء سيء:

while(!ready) {
   /* Wait for some other thread to set ready */
}

...هو حقا حقا طريقة مكلفة انتظر سوف تستخدم الكثير من وحدة المعالجة المركزية مثل نظام التشغيل سوف تعطيه طالما ready هي كاذبة تسرق الوقت وحدة المعالجة المركزية مع أي موضوع آخر يمكن القيام بعمل مفيد.

ومع ذلك حلقة الخاص بك هو لا لا تفعل شيئا:

while ((c = getchar()) == ' ')
    {};  // skip

...لأنه يدعو getchar() على كل التكرار.ومن ثم الجميع وافق على ما قمت به على ما يرام.

ولقد استعملت كود مثل هذا. أنا لا أعتقد أن هناك حقا أي سبب لعدم استخدامه اذا اقتضى الامر.

وأنا لا يفكر مشكلة في ذلك. يمكنك استخدامه في كثير من الحالات وأنا أفضل ذلك.

والطريقة الكنسي - تستخدم منذ زمن سحيق، لديها نظرة، على سبيل المثال، في كتاب ليون - هو

while(condition)       // Here's the whole thing
    ;                  // empty body.

في الواقع، بشكل عام يستخدم "semicolor على سطر منفصل" اتفاقية لبيان فارغة. سوف، على سبيل المثال، انظر كلما

if( condition-1)
     ;
else if (condition-2)
     stmt;
else {
     // do stuff here
}

وانها أكثر بكثير من غير المألوف، ولكن يظهر إما حيث <م> شرط 1 معقد جدا، لذلك كنت لا تريد أن ينفي ذلك وفرصة الارتباك، أو حيث رمز تم اليد الأمثل في شبر واحد من حياتها، بحيث تريد الحالة الأكثر شيوعا أولا.

و

while(condition) ;

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

 while(condition){
 }

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

حسنا، وليس حقا ولكن ذلك يعتمد على الهندسة المعمارية الخاصة بك.

if (dosomething()) { ; }

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

وخيار بديل التي لم يرد ذكرها بعد:

while(condition)
    (void)0;

في الحقيقة أنا لا أفضل أن يكتب لي الحلقات بهذه الطريقة ، ولكن كان لدي TA الفصل الدراسي الماضي الذي فعل.

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