char array c++




الأقواس حول سلسلة الحرفية في شار صفيف صالحة؟(مثل char s[]={"Hello World"}) (4)

بالصدفة ، وجدت أن السطر char s[] = {"Hello World"}; يتم تجميعه بشكل صحيح ويبدو أنه يعامل بنفس معاملة char s[] = "Hello World"; . أليس الأول ( {"Hello World"} ) صفيفًا يحتوي على عنصر واحد يمثل صفًا من الأحرف char ، لذلك يجب أن يقرأ الإعلان الخاص بـ char *s[] ؟ في الواقع إذا قمت بتغييره إلى char *s[] = {"Hello World"}; المترجم يقبله كذلك ، كما هو متوقع.

بالبحث عن إجابة ، المكان الوحيد الذي وجدته والذي ذكر هذا هو هذا المكان ولكن لا يوجد ذكر للمعيار.

لذلك سؤالي هو ، لماذا السطر char s[] = {"Hello World"}; يتم ترجمة على الرغم من أن الجانب الأيسر من نوع array of char والجانب الأيمن من نوع array of array of char ؟

فيما يلي برنامج العمل:

#include<stdio.h>
int main() {
    char s[] = {"Hello World"};
    printf("%s", s); // Same output if line above is char s[] = "Hello World";
    return 0;
}

شكرا على اي توضيحات

PS مترجم بلدي هو مجلس التعاون الخليجي - 4.3.4.


[...] في الواقع إذا قمت بتغييره إلى char * s [] = {"Hello World"}؛ المترجم يقبله كذلك ، كما هو متوقع

يقوم المحول البرمجي بقبوله ، لأنه في الواقع ، تقوم بإنشاء صفيف ثنائي الأبعاد من عناصر الحجم غير المحددة ، حيث قمت بتخزين عنصر واحد فقط ، سلسلة "Hello World" . شيء من هذا القبيل:

char* s[] = {"Hello world", "foo", "baa" ...};

لا يمكنك حذف bracets في هذه الحالة.


أي متغير في ( int ، char ، وما إلى ذلك) هو مجرد مجموعة من الطول 1.

char s = {0};

يعمل كذلك.


قد أكون مخطئًا ، لكنني أعتقد أن هذه ليست مجموعة من الصفائف من الأحرف ، لكن كتلة تحتوي على مجموعة من الأحرف. int a = {1}; قد تعمل كذلك.


مسموح به لأن المعيار يقول ذلك: C99 section 6.7.8 ، §14:

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

ما يعنيه هذا هو أن كليهما

char s[] = { "Hello World" };

و

char s[] = "Hello World";

ليست أكثر من السكر النحوي ل

char s[] = { 'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', 0 };

في ملاحظة ذات صلة (القسم نفسه ، الفقرة 11) ، C تسمح أيضًا بمقاسات حول مثيلات العددية مثل

int foo = { 42 };

الذي ، بالمناسبة ، يناسب بشكل جيد مع بناء جملة الحرفي المركب

(int){ 42 }




array-initialization