array - sizeof in c




لماذا لا يتم زيادة sizeof(x++) x؟ (6)

في ما يلي التعليمة البرمجية المترجمة في نوافذ dev c ++:

#include <stdio.h>

int main() {
    int x = 5;
    printf("%d and ", sizeof(x++)); // note 1
    printf("%d\n", x); // note 2
    return 0;
}

أتوقع أن يكون x 6 بعد تنفيذ الملاحظة 1 . ومع ذلك ، فإن الناتج هو:

4 and 5

هل يمكن لأي شخص أن يفسر لماذا لا يتم زيادة x بعد الملاحظة 1 ؟


لا يمكن تنفيذ التنفيذ أثناء التحويل البرمجي. لذلك لن يحدث ++i / i++ . كما لن يقوم sizeof(foo()) بتنفيذ الوظيفة ولكن يتم عرض النوع الصحيح.


من معيار C99 (التشديد لي)

6.5.3.4/2

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


يحاول sizeof(foo) حقا من الصعب اكتشاف حجم تعبير في وقت الترجمة:

6.5.3.4:

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

باختصار: صفائف طول متغير ، تعمل في وقت التشغيل. (ملاحظة: صفائف الطول المتغير هي ميزة محددة - وليس الصفائف المخصصة مع malloc(3) .) وإلا ، يتم حساب نوع التعبير فقط ، وذلك في وقت التحويل البرمجي.


يعطي المشغل sizeof() حجم نوع البيانات فقط ، ولا يقوم بتقييم العناصر الداخلية.


sizeof هو عامل تشغيل وقت التجميع ، لذلك في وقت التجميع يتم استبدال حجمه ومعامله بقيمة النتيجة. لا يتم تقييم المعامل (إلا عندما يكون صفيف طول متغير) على الإطلاق ؛ فقط نوع النتائج مهم.

short func(short x) {  // this function never gets called !!
   printf("%d", x);    // this print never happens
   return x;
}

int main() {
   printf("%d", sizeof(func(3))); // all that matters to sizeof is the 
                                  // return type of the function.
   return 0;
}

انتاج:

2

كما تحتل short 2 بايت على الجهاز الخاص بي.

تغيير نوع الإرجاع للدالة إلى double :

double func(short x) {
// rest all same

سوف تعطي 8 الناتج.


sizeof هو عامل بناء وقت تجميع وليس وظيفة. يصبح هذا واضحًا جدًا في الحالات التي يمكنك استخدامها بدون الأقواس:

(sizeof x)  //this also works




sizeof