سؤال

شخص ما يكتب هذه الوظيفة

void strToUpper(char *p) {
  while (*p) {
    *p = TOUPPER(*p);
    *p++;                //<-- Line to pay attention
  }
}

سألت ، لماذا تضع * قبل p ++؟

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

void strToUpper(char *p) {
  while (*p) {
    *p = TOUPPER(*p);
    p++;                //<-- Line to pay attention
  }
}

لذلك أود مشاركة هذا مع Stackoverflow ، مثال:

char s [6] = "Hello" ؛

ماذا ستفعل؟

*++ptr;

سيقوم هذا بتقييم ++ قبل المخلصة (فوق المؤشر) ومن ثم مشغل dereference *، لذلك سوف يسمح لقيمة char "E" (الحرف الثاني من "Hello") (لا يتم استخدامه في هذه الحالة ويمكن أن يولد تحذير على التجميع) وسيشير المؤشر من "E" (الموضع 1)

ماذا ستفعل؟

*ptr++;

هذا غريب بعض الشيء لأنه سيقوم بتقييم مشغل dereference * أولاً ، لذلك سيسمح لقيمة char "H" (لا يتم استخدامها في هذه الحالة) ، ثم ++ بعد النسبة (إلى المؤشر) ، لذلك (مرة أخرى) سيشير المؤشر من "E" (الموضع 1)

ماذا ستفعل؟

ptr++;

أخيرًا ، لن يحتوي على lvalue من char ، لكنه لن يولد أي تحذير إذا لم يتم استخدامه ، وسيشير المؤشر من "E" (الموضع 1) أيضًا.

هذه النماذج الثلاثة تفعل نفس الشيء من وجهة نظر عنوان المؤشر ..

IMHO هذا هو أسوأ شيء لبعض لغات الكمبيوتر (الجميع تقريبًا) ..

"هناك مسافة هامينغ رديئة بين أي رمز وأي خطأ"

ليس لدينا أي تكرار عند البرمجة ، وإذا أخذت كتاب قانون ، وكتابة تشارح عشوائية في الداخل ، فسيكون ذلك قابلاً للقراءة ، ولكن إذا كتبت عشوائيًا عند البرمجة ، فستحصل على خطأ ، دقة 100 ٪

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

المحلول

++ له الأسبقية على *. لكنني أتفق ، من غير الواضح عندما تخلط في نفس البيان.

نصائح أخرى

وفقا لسباحة المشغل في ج ، ++ سيتم تقييمه أولاً ، وعندها فقط *. لذلك في *p++, ptr سيحصل على قيمته محفوظة ، وبعد ذلك سيحصل البيان على قيمة opbject ptr يشير الآن إلى. بالطبع ، هذا لا يختلف عن ptr++, ، بما أنك لا تستخدم قيمة البيان.

أي شخص يمزج ++ ، -، += etc مع المشغلين الآخرين قد فشل بالفعل في كتابة رمز قابل للقراءة ، حقيقة أنها سوف تخرجها ليست أكثر من مستحقتها.

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