האם יש הבדל בין שימוש ב- (;;) ובזמן (1)?


תשובה 1:

מבחינת הקוד שנוצר, כל מהדר C מודרני אמור לתת לך את אותן תוצאות.

מחברים, פרופסור ואחרים שאומרים שעבור (;;) מייצר יותר תקורה או (א) לא יודעים על מה הם מדברים, או (ב) עובדים עם מהדרים קדומים או שבורים. עבור (;;) לא מייצר תקורה נוספת, מכיוון שאין מצב ואין דריכה של משתנה לולאה. אם כבר, בעוד ש- (1) במהדר קדום שאינו מייעל מיטוב עשוי לייצר יותר תקורה, מכיוון שהוא בודק אם 1 הוא לא אפס בראש כל איטרציה. מהדרים מודרניים לא יעשו זאת.

ביישומי קומפיילר מסוימים, אם תפצפו את רמות האזהרה מספיק גבוה או תשתמשו בכלי דמוי מוך, אתם עשויים לקבל אזהרה בזמן (1), או שווה ערך לזה, שאומר שמשהו כמו ביטוי מותנה הוא קבוע. שכן (;;) לא מפיק אזהרה כזו, מכיוון שאין ביטוי מותנה כלל. עבדתי על פרויקטים שבהם רצינו לערוך עם אפס אזהרות, ובחרתי להשתמש בהם עבור (;;) במקום זמן מה (1). כמו כן, עבור (;;) יכול להיות קל יותר לחפש את גרסאות הזמן.

אגב, אם אתה מתכוון להשתמש בזה, זה נחשב לקריא יותר לומר:

בזמן (נכון)

מאשר לומר:

בזמן (1)

למרות שהראשון דורש יותר הקלדה.

ב- C המודרנית (כלומר מאז C99 בשנת 1999), אינך אמור ליצור גרסה משלך ל- TRUE. במקום זאת, כלול את קובץ הכותרת stdbool.h, ותהיה לך גישה לסוג נתוני ה- bool שהוגדר (במקום שתצטרך להשתמש במילת המפתח _Bool) והסמלים נכונים ושקריים. לגלגל את הערכים האמיתיים / שווא שלך הוא כל כך ...

... 1998


תשובה 2:

התקן: C ++ רגיל

6.5.3 ההצהרה עבור for1 הצהרה for (עבור התנאי לחקירה (ביטוי אופטי); ביטוי אופטי) היא שווה ערך ל- [code] {הצהרת for-init-הצהרה ואילו (תנאי) {ביטוי; }} [/ קוד] למעט ששמות המוצהרים בהצהרת ה- for-init נמצאים באותו אזור הצהרתי כמו אלה המוצהרים בתנאי, ומעט שהמשיך בהצהרה (שלא כלול בהצהרת איטרציה אחרת) יבצע ביטוי לפני שיחזור הערכת מצב. [הערה: לפיכך ההצהרה הראשונה מציינת אתחול עבור הלולאה; התנאי (6.4) מציין בדיקה שנעשתה לפני כל איטרציה, כך שהלולאה יוצאת כאשר התנאי הופך להיות שקרי; הביטוי מציין לרוב תוספות שנעשות לאחר כל איטרציה. - הערת סיום] 2 ניתן להשמיט את התנאי או את שניהם. תנאי חסר הופך את הסעיף המשתמע למשהו בזמן (נכון).

אולי


תשובה 3:

כל מהדר ששווה את המלח שלו יפיק קוד זהה בשני המקרים.

העדפה אפשרית אחת לאפשרות for (;;) היא שכמה (רבים?) אנשים רואים את זה כ"סגנון ירוד "להשתמש בקבצים מספריים בקוד. כלומר, אתה לא כותב

x + = 10;

אבל אתה כותב

static const int my_constant_value = 10;

(...)

x + = my_constant_value;

הסיבה היא שלדברי כל קבועים מספריים המוצהרים במפורש (ועדיף בראשית קובץ המקור, במקום להתפשט בכל הקובץ), מוביל לקוד בר-קיימא.

ברור שזה לא משנה בכל הנוגע ל- (;;) לעומת while (1), אבל לראות '1' בקוד ללא מספרי זה עדיין לא נוח.

ב- C ++ (ומאז C99, גם ב- C) אנו יכולים לכתוב "בזמן (נכון)", אך זה אפילו ארוך יותר מ- "while (1)", שהוא עצמו ארוך יותר (לפי תו 1) מאשר "עבור (;;)) ".