nima uchun har bir funktsiyani chaqirishda statik o'zgaruvchining boshlang'ichi, lekin har safar C da e'lon qilishimiz kerak

Buni o'qidim: statik o'zgaruvchining faqat bir marta boshlanishi (avtomatik o'zgarmaydiganga o'xshamaydi) va statik o'zgaruvchining qo'shimcha ta'rifi ish vaqtida yonib ketadi. havoladagi .

unda nima uchun men "kodni e'lon qilmaganligim" deb nomlangan xatoga yo'l qo'yyapman. Men dasturni yozdimki, statik o'zgaruvchining "i" faqatgina birinchi marta boshlanganida c 0 ga teng bo'ladi. Men faqat statik o'zgaruvchining aslida qanday ishlashini bilishni istayman va shuning uchun statik o'zgaruvchini faqat bir marta e'lon qilaman. Mening savolim, agar statik o'zgaruvchi har bir funktsiya chaqiruvida bir marta e'lon qilsa, unda nima uchun mening kodim ishlamayapti va uni har bir chaqiriqda e'lon qilish kerak bo'lsa, unda nima uchun u har bir funktsiya chaqiruvida noto'g'ri ishlamaydi.

#include

int c=0;

int test()
{
    if(c==0)
       {
           static int i=0;
       }
    c++;
    i++;
    if(i==5)
        printf("%d\n",i);
    else
        test();
}
int main()
{
    test();
    return 0;
}
3
Chiziq sizning do'stingiz.
qo'shib qo'ydi muallif user1952500, manba

6 javoblar

Agar siz agar lokal ko'lamdagi o'zgaruvchini aniqlaysiz. Tashqarida joy yo'q. static , faqat darajada (aka ishlash muddati) bilan shug'ullanadi.

Jingalak qavslar va nayzalardan foydalaning. Keyin xatoingizni ko'rasiz.

4
qo'shib qo'ydi
Bu bo'lishi mumkin. Buning echimi, real muammolar echimiga olib keladi.
qo'shib qo'ydi muallif Amin Negm-Awad, manba
Aytganingizdek: Sizning darajangiz bilan emas, balki ko'lamda muammo bor. static bu tortib olsa o'zgarmaydi, shuning uchun muammoingizni static bilan hech qanday aloqasi yo'q. Muammoni doirasi bilan ta'mirlash. (Agar siz tortib olsa va miqyosidagi so'zlarini bilmasangiz, bu haqda biror narsa o'qing, chunki u C uchun muhim.
qo'shib qo'ydi muallif Amin Negm-Awad, manba
Haqiqiy muammo emas. O'xshash i i statik o'zgaruvchini i deb e'lon qilishga urinayotganga o'xshaydi va bu funksiya orqali faqat birinchi marta bajarishni istaydi. Buni qilish kerak emas.
qo'shib qo'ydi muallif FredK, manba
Men faqat statik o'zgaruvchining aslida qanday ishlashini bilishni istayman va shuning uchun statik o'zgaruvchini faqat bir marta e'lon qilaman. Mening savolim, agar statik o'zgaruvchi har bir funktsiya chaqiruvida bir marta e'lon qilsa, unda nima uchun mening kodim ishlamaydi va agar har bir chaqiriqda e'lon qilish kerak bo'lsa, unda nima uchun u har bir funktsiya chaqiruvida intiallise bo'lmaydi.
qo'shib qo'ydi muallif Piyush Mittal, manba

Boshqalarni eslatgan qavslarni qo'shish bu muammoni hal qilmaydi. Haqiqiy yechim faqat if (c == 0) qatorini butunlay olib tashlashdir. i ning statik deklaratsiyasi funktsiyaning birinchi qatori bo'lishi kerak.

Bu sizning xohishingiz:

int test()
{
    static int i=1;

    if(i==5)
        printf("%d\n",i);
    else
        test();
}
2
qo'shib qo'ydi
Hech kim, braxiyani qo'shish masalasini hal qilishini aytdi.
qo'shib qo'ydi muallif Amin Negm-Awad, manba
Yo'q, buni hech kim aytmadi.
qo'shib qo'ydi muallif Amin Negm-Awad, manba
Sizning taklifingizdagi jumla, bu muammoni hal qila olmasligini aytmaydi. Bundan tashqari, keyingi jumla shunday: "Keyin xatoingizni ko'rasiz." Unday emas: "u holda sizning xatolaringiz tugadi".
qo'shib qo'ydi muallif Amin Negm-Awad, manba
@Amin Albatta, ular qildilar. Hatto sizning javobingiz "Bukuvchi va qaltiroqlardan foydalaning" deb aytdingiz.
qo'shib qo'ydi muallif FredK, manba
Sizning javobingizdan to'g'ridan-to'g'ri gapiraman
qo'shib qo'ydi muallif FredK, manba
Men faqat statik o'zgaruvchining aslida qanday ishlashini bilishni istayman va shuning uchun statik o'zgaruvchini faqat bir marta e'lon qilaman. Mening savolim, agar statik o'zgaruvchi har bir funktsiya chaqiruvida bir marta e'lon qilsa, unda nima uchun mening kodim ishlamaydi va agar har bir chaqiriqda e'lon qilish kerak bo'lsa, unda nima uchun u har bir funktsiya chaqiruvida intiallise bo'lmaydi.
qo'shib qo'ydi muallif Piyush Mittal, manba

i ko'lami shundan iboratki, agar quyidagi kod blokda bo'lsa:

if(c==0)
    static int i=0;

xuddi shunday

if(c==0)
{
    static int i=0;
}

i is not available outside the if block

1
qo'shib qo'ydi
Men buni ham sinab ko'rdim, lekin men xato qilaman.
qo'shib qo'ydi muallif Piyush Mittal, manba

Buning sababi, 'i' o'zgarmaydigan doirasi faqatgina (agar) bo'lsa. Shunday qilib, 'i' ni oshirishda Compiler xatoga yo'l qo'yadi.

1
qo'shib qo'ydi

statik funktsiyasi blok yoki funktsiyani joylashtirsangiz, bu o'zgaruvchining miqdordan tashqarida mavjud bo'lmaydi, chunki {} bo'lmasa, amalga oshiriladi. Shunday qilib, uni boshqa joyda ishlatib bo'lmaydi va kompilyator xato qiladi.

0
qo'shib qo'ydi

Sizning kompilyatingizdagi xatolikni tuzatish uchun, vaziyatdan tashqari e'lon qilaman. Va vaziyatni nolga qo'ying -

static int i;
if ( c == 0 )
    i = 0;

Bu xatoni ketkazadi.

Lekin siz erishmoqchi bo'lgan narsa global o'zgaruvchiga ega bo'lishni talab qilmaydi.

Siz buni qilishingiz mumkin

static int i = 0;
i++;

Birinchi marta u nolga o'rnatiladi, shuning uchun u boshlanmaydi.

0
qo'shib qo'ydi