C99: هل يمكنني الإعلان عن المتغيرات في بداية كتلة في "ل"؟

StackOverflow https://stackoverflow.com/questions/1880745

  •  18-09-2019
  •  | 
  •  

سؤال

هل الكود القانوني التالي وفقا ل C99؟

...
for(....) {
int x = 4;
...
}
...

يمكنك افتراض أنه قبل السطر 3 لم يتم الإعلان عن المتغير X.

C99 (PDF)

حتى الآن لقد وجدت فقط ما يلي، لكنني لا أعتقد أن هذا يكفي:

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

من صفحة 145 من هذا PDF.

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

المحلول

نعم، يمكنك إعلان أو تحديد متغير في أي مكان تريده في C99 (في بداية كتلة في C89).

أنت قلت:

"يمكنك أن تفترض أنه قبل السطر 3 لم يتم الإعلان عن المتغير X."

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

int x = 0;               /* old x */
printf("%d\n", x);       /* old x, prints 0 */
do {
    int x = 42;          /* new x */
    printf("%d\n", x);   /* new x, prints 42 */
} while (0);
printf("%d\n", x);       /* old x, prints 0 */

لم أحاول أبدا ما يلي في C99. أنا حقا لا أعرف ماذا يحدث :)
سأحاول لاحقا، عندما أحصل على إمكانية الوصول إلى (تقريبا) C99

int x = 0;
do {
    printf("%d\n", x);   /* old x? new x? crash? Undefined Behaviour? */
    int x = 42;
} while (0);

ميزة C99 من إعلان / تحديد المتغيرات أينما يريد المرء ليست ميزة تجعلني أرغب في تغيير :)

نصائح أخرى

هذه قانونية في كل من C99 و C89. انظر إلى 6.8.2، الذي يحدد بيان المركب

نعم، يمكنك إنشاء متغير في بداية أي كتلة. يتم تهيئة المتغير في كل مرة يتم فيها إدخال الكتلة في C ++، يمكنك إنشاءها في أي مكان داخل الكتلة.

for(....)
{
  int x=4;
  /*More code*/
}

نعم هذا قانونية في C99 ولكن لا يسمح لك بالوصول إلى "X" بعد block.it سيكون سلوك غير محدد في محاولة الوصول إلى "X" خارج نطاقها.

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