سؤال

لقد قيل لي أنه إذا كنت أقوم بالترميز في ANSI-C للإعلان بالترتيب الذي سيتم به استخدام المتغيرات، والتأكيد على أن المؤشرات ليست فارغة وأن المؤشرات ضمن الحدود، والتهيئة قبل استخدام المتغير مباشرة.

إذا أعلنت عن const، فهل يمكنني تهيئته بعد مجموعة من التأكيدات والتعليمات البرمجية؟في Java، يجب أن تتم عمليات التهيئة النهائية عند الإعلان، ولكن هل من المتسق من خلال تطبيقات ANSI-C أنه يمكنني تهيئة const مرة واحدة ولكن ليس بالضرورة في وقت الإعلان؟

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

المحلول

ومترجم جافا يحتوي على كمية صغيرة من المنطق تدفق للسماح لك initalise المتغيرات final بعد إعلانهم. هذا هو جافا القانوني:

final int something;

if ( today == Friday )
    something = 7;
else
    something = 42;

وجافا سيكشف اذا غادرت أي فروع القيمة النهائية غير معروف. انها لن تحليل الظروف، لذلك هذا ليس جافا القانوني، على الرغم من انها مماثلة منطقيا:

final int something;

if ( today == Friday )
    something = 7;

if ( today != Friday )
    something = 42;

في ANSI C89، المتغيرات const (غير extern) يجب أن initialised في بيان يتم الإعلان عنها في.

const int something = ( today == Friday ) ? 7 : 42;

وومعدل extern على إعلان يقول المترجم الذي initialised المتغير في وحدة complation مختلفة (أو في أي مكان آخر في هذه الوحدة تجميع).

في ANSI C99، يمكنك مزج الإعلانات والتعليمات البرمجية، حتى تتمكن من إعلان والتهيئة متغير const بعد كتلة من تأكيدات ورمز. يبقى قابلية 1999 ANSI C قضية.

وهناك عمل حول لC89 هو أن نلاحظ أن قواعد الإعلانات السابقة تعمل شفرة في نطاق كتلة بدلا من نطاق وظيفة، حتى تتمكن من القيام بذلك:

#include<stdio.h>

int main ( void )
{
    printf ( "wibble\n" );

    {
        const int x = 10;

        printf ( "x = %d\n", x );
    }

    return 0;
}

نصائح أخرى

للقراءة فقط

والمتغيرات const، ويجب initialised حيث انهم محددة.

وهذا الرمز ينتج error: assignment of read-only variable 'foo' (gcc4):

const int foo;
foo = 4;

والشيء نفسه ينطبق على مؤشرات CONST (لاحظ هنا: const int * ليس مؤشر CONST، ولكن مؤشر إلى CONST):

int * const foo;
foo = 4;

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

int a, b, c;

a = 12;
// do some stuff with a

b = 17;
// do some stuff with a and b

c = 23;
// do some stuff with a, b, and c

وبعد:

int a = 12;
// do some stuff with a
{
    int b = 17
    // do some stuff with a and b
    {
        int c = 23;
        // do some stuff with a, b and c
    }
}

ومع C99 بالطبع، يمكنك تحديد المتغيرات الأخرى مما كانت عليه في بداية كتلة:

int a = 12;
// do some stuff with a

int b = 17
// do some stuff with a and b

int c = 23;
// do some stuff with a, b and c

لا يمكن تهيئة CONST بعد إعلان داخل الجسم وظيفة، ولكن يمكنك فقط فتح كتلة واحدة بعد التأكيدات الخاصة بك:

void func()
{
    int y;
    //do assertions
    assert(something);
    {
        int const x = 5;
        // function body
     }
}

باستثناء نطاق الكتلة وطرق الإعلان C99 التي أظهرتها الآخرين، فإن الإجابة هي لا؛لا يمكنك تأجيل تهيئة متغير const.على أية حال، const ليس مفيدًا جدًا للمتغيرات المحلية.الأوقات الرئيسية التي أستخدم فيها الكلمة الأساسية const في لغة C هي:

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

أعلن أحيانًا عن المتغيرات المحلية const إذا اعتقدت أنها ستساعد القارئ في فهم دالة ما، لكن هذا نادر جدًا.

إذا كنت تتحدث عن تقسيم تعريف

const int x = 2;

وإلى قسمين:

const int x;

x=2;

وأخشى أن من غير الممكن في C.

إذا كنت أنت، وأود أن محاولة للتأكد من أنني أفهم القصد من قواعد الترميز التي تصفون. أشك في قواعد الترميز عاقل منع تهيئة المتغيرات (حتى المتغيرات غير CONST).

وردا على تعليقات مختلفة:

const int * p;

وليست إعلان متغير CONST. وهو إعلان متغير مؤشر غير CONST إلى كثافة CONST.

ويمكنك يعلن

extern const int x;

ولكن لا يزال بإمكانك ليس تهيئة العاشر بعد تنفيذ التعليمات البرمجية، والشيكات التأكيد، ...

إذا كنت ترغب في الإدلاء بعيدا CONST على LHS، ماذا عن هذا؟

const int n = 0;

*((int*)&n) = 23;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top