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