سؤال

أحاول هذا الرمز على مترجم غنو C ++ وأنا غير قادر على فهم سلوكه:

#include <stdio.h>;

int main()
{
    int  num1 = 1000000000;
    long num2 = 1000000000;
    long long num3;
    //num3 = 100000000000;
    long long num4 = ~0;

    printf("%u %u %u", sizeof(num1), sizeof(num2), sizeof(num3));
    printf("%d %ld %lld %llu", num1, num2, num3, num4);
    return 0;
}

عندما لا أفعل الخط المعلق، لا يترجم الشفرة ويعطي خطأ:

خطأ: ثابت عدد صحيح كبير جدا لنوع طويل

ولكن، إذا تم تجميع التعليمات البرمجية كما هو ويتم تنفيذها، فإنه ينتج قيم أكبر من 10000000000.

لماذا ا؟

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

المحلول

تتكون الحروف 100000000000 ثابت عدد صحيح حرفي، ولكن القيمة كبيرة جدا بالنسبة للنوع int. وبعد تحتاج إلى استخدام لاحقة لتغيير نوع الحرفي، أي

long long num3 = 100000000000LL;

لاحقة LL يجعل الحرفي في النوع long long. وبعد C ليس "ذكيا" بما يكفي لاستنتاج هذا من النوع الموجود على اليسار، والنوع هو خاصية للحرفي نفسه، وليس السياق الذي يتم فيه استخدامه.

نصائح أخرى

يحاول:

num3 = 100000000000LL;

و BTW، في C ++ هذا ملحق مترجم، لا يعرف المعيار طويلا، وهذا جزء من C99.

ذلك يعتمد في الوضع الذي تجميعه. طويل طويل ليس جزءا من معيار C ++ ولكن فقط (عادة) مدعوم كملحق. هذا يؤثر على نوع الحرفيين. حرفي عدد صحيح العشري دون أي لاحقة هو دائما من النوع الدولي إذا كانت int كبيرة بما فيه الكفاية لتمثيل الرقم، على خلاف ذلك لفترة طويلة. إذا كان الرقم كبيرا جدا لفترة طويلة، فستكون النتيجة المعرفة بالتنفيذ (ربما مجرد عدد من النوع القديم القديم الذي تم اقتطاعه للتوافق المتخلص). في هذه الحالة، يجب عليك استخدام لاحقة LL بشكل صريح لتمكين التمديد الطويل الطويل (على معظم المحامرة).

سوف يدعم نسخة C ++ التالية رسميا لفترة طويلة بطريقة لن تحتاج إلى أي لاحقة إلا إذا كنت ترغب صريحا في أن تكون قوة النوع الحرفي لفترة طويلة على الأقل. إذا كان الرقم لا يمكن تمثيله في فترة طويلة، فسوف يحاول المحول البرمجي تلقائيا استخدام فترة طويلة حتى دون لاحقة LL. أعتقد أن هذا هو سلوك C99 كذلك.

الكود الخاص بك يجمع هنا غرامة (حتى مع هذا الخط غير المطالب. كان يجب تغييره إلى

num3 = 100000000000000000000;

لبدء الحصول على التحذير.

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