C ++ belgisi/mos yozuvlar sintaksisini ochish

Yaqinda menda axborot uzatish tekshiruvi o'tkazildi, unda menda shubha uyg'otadigan kod mavjud edi. Mana:

#include 
using namespace std;

int f1(int *a) {
    return *a + 1;
}

int *f2(int *a) {
    return a + 1;
}

int *f3(int &a) {
    return &a + 1;
}

int main() {
    int t[] = {0, 1, 2, 3};
    cout << f1(f3(*f2(t)));
    return 0;
}

Baholash masalasi "Dasturning natijasi nima?". Buni tuzib, men uchtasini olaman.

Bilaman, bu ko'rsatgich va varaqalar bilan shug'ullanishning turli usullarini aks ettiradi, lekin men mantiqning boshi yoki hikoyasini qilolmayman.

Kimdir bu kodning turli satrlarini sharhlab, t qatoriga/vektoriga ishlov berish usullarini qanday qilib buzayotganini tushuntirib bera oladimi? Xususan, int * funktsiyasi qanday natijalar bilan o'zaro aloqasi borligini tushunmayman (u yoki bu ma'lumotni qaytarib berolmaydigan qiymatni qaytaradi). Keyinchalik, funktsiyalarning turli jismlaridagi intervalli/havola operatori qanday ishlatilayotgani yoki foydalanilmayapti. Men faqat buning mantig'ini ochishga harakat qilyapman va men aksning atrofiga aylana boshlayman.

EDIT With a bit of help I believe I have this one licked. Check my answer below.

1
Bir qator qog'ozga qatorni chizish. Kodni izlayotganingizda uning elementlariga ishora qiluvchi o'qlarni chizish.
qo'shib qo'ydi muallif molbdnilo, manba
Nega bu masalani yozmaysiz? Siz nima deb o'ylaysiz, nima yuz beradi? Agar siz ko'rsatgichlar va ko'rsatgichlarni o'chirish haqida bilmasangiz, bu sahifani o'qing . Biz sizning uy vazifangizni siz uchun qilolmaysiz, chunki hech narsa o'rganmaysiz. C ++ dagi ko'rsatgichlar bilan o'ynashga harakat qiling, masalan, Microsoft Visual Studio
qo'shib qo'ydi muallif JHBonarius, manba
@Brad Hech bo'lmasa ogohlantirish berishi kerak.
qo'shib qo'ydi muallif Neil Butterworth, manba
@Brad Hech bo'lmasa ogohlantirish berishi kerak.
qo'shib qo'ydi muallif Neil Butterworth, manba
"Int * funktsiyasida * natija bilan qanday aloqada bo'lishini tushunmayapman (u ma'lumotni qaytib yoki qaytara olmaydi)" Bundan tashqari, u ko'rsatkichni qaytaradi.
qo'shib qo'ydi muallif Neil Butterworth, manba
@ J.H.Bonarius Men bu taklifni qabul qilaman. Yaxshiyamki, men oddiygina C ++ kursini onlayn ravishda o'tkazaman. Hatto maktab orqali emas, uy vazifasi ham shug'ullanmaydi. Biroq, bu muammoni alohida ta'kidlab, bu haqda ko'proq bilmoqchi edim. Kirishingiz uchun tashakkur.
qo'shib qo'ydi muallif Brad Hansen, manba
@NeilButterworth shunga o'xshash mantiq bilan ishora qiladigan qiymatni qaytarib bermoqchi bo'lsa, xato qiladi, to'g'rimi?
qo'shib qo'ydi muallif Brad Hansen, manba
@molbdnilo Rahmat, men bu taklifga rioya qilaman. Hatto javob berishim mumkin.
qo'shib qo'ydi muallif Brad Hansen, manba

6 javoblar

Bo'ling va fath qiling:

int t[] = {0, 1, 2, 3};//t is a pointer to the first element of the array
int &a(*f2(t));//f2(t) returns a pointer, so you need to "dereferencing" using *, to get the referece to the value
int *b = f3(a); //f3(a) take an int by reference va return a pointer to an int
cout << f1(b); //f1(b) take a pointer to an int va returns an int value;

Shuningdek, ushbu ikki satr bilan ehtiyot bo'ling:

return &a + 1;

va

return *a + 1;

Ehtimol, siz o'ylayotgan narsalarni qilolmaysiz.

Shuni yodda tutingki, bu 3 funktsiya ko'rsatkich ko'rsatkichi bilan markerni oshiradi

3
qo'shib qo'ydi
@Brad: f2 Agar mos yozuvlar olgan ko'rsatgichga * qo'llaganingizda ko'rsatgichni qaytaradi. Ushbu havola mos yozuvlar ( int/a = ) yoki nusxasini ( int a = ) boshlash uchun ishlatilishi mumkin, lekin savolda kod f3 (* f2 (t)) va Rama-ning qayta yozishi qo'shimcha nusxasi tufayli yaroqsiz.
qo'shib qo'ydi muallif Ben Voigt, manba
@Brad ADDRESS haqida gapirish foydali bo'lishi mumkin. Ikkala ko'rsatgich va zikr qilish ham ichki manzilga ajratilgan manzilga bog'liq bo'lib, farq shundaki, har ikkala pointer va murojaatlar ham manzilga, ham qiymatga kirishga ruxsat berganda, murojaatlar qiymatga qaratilgan va ko'rsatgichlar manzilga yo'naltirilgan.
qo'shib qo'ydi muallif Ben Voigt, manba
int va a = * f2 (t) bo'lishi kerak, aks holda f3 (a) tomonidan kiritilgan manzil qatorga ishora qilmaydi va keyingi ko'rsatkich arifmetik fáìlì
qo'shib qo'ydi muallif Ben Voigt, manba
@BenVoigt yaxshi nuqtasi! Malumot liniyasini tahrirladim: int & a (* f2 (t));
qo'shib qo'ydi muallif Rama, manba
f2 (t) , albatta, f2 (& t [0])
qo'shib qo'ydi muallif ssell, manba
int * t [2] mos yozuvlar olish uchun f1 kodi foydalanadi * , so'ngra keyingi elementga int qiymatini qaytaruvchi qatorni.
qo'shib qo'ydi muallif Brad Hansen, manba
f2 (va t [0]) funktsiyasi yordamida int * t [1] , f3 (* (int * t [1])) int * t [2] funktsiyasini qaytaradi va f1 (int * t [2]) t [2] + 1 .
qo'shib qo'ydi muallif Brad Hansen, manba
@BenVoigt Men nima deyayotganingizni ko'ryapman. Agar u bu turdagi mos yozuvlar qiymatini qabul qilsa, u faqat f2 dan qaytish qiymati sifatida kerak bo'ladi.
qo'shib qo'ydi muallif Brad Hansen, manba
aniq tushuntirish uchun sizga katta rahmat. Mening oxirgi savolim bor. "F1" funktsiyasi uchun. T qiymati [3] ni tanlab, qiymatini qo'shib, int qiymatini 3 qaytaradi?
qo'shib qo'ydi muallif Brad Hansen, manba

Bo'ling va fath qiling:

int t[] = {0, 1, 2, 3};//t is a pointer to the first element of the array
int &a(*f2(t));//f2(t) returns a pointer, so you need to "dereferencing" using *, to get the referece to the value
int *b = f3(a); //f3(a) take an int by reference va return a pointer to an int
cout << f1(b); //f1(b) take a pointer to an int va returns an int value;

Shuningdek, ushbu ikki satr bilan ehtiyot bo'ling:

return &a + 1;

va

return *a + 1;

Ehtimol, siz o'ylayotgan narsalarni qilolmaysiz.

Shuni yodda tutingki, bu 3 funktsiya ko'rsatkich ko'rsatkichi bilan markerni oshiradi

3
qo'shib qo'ydi
@Brad: f2 Agar mos yozuvlar olgan ko'rsatgichga * qo'llaganingizda ko'rsatgichni qaytaradi. Ushbu havola mos yozuvlar ( int/a = ) yoki nusxasini ( int a = ) boshlash uchun ishlatilishi mumkin, lekin savolda kod f3 (* f2 (t)) va Rama-ning qayta yozishi qo'shimcha nusxasi tufayli yaroqsiz.
qo'shib qo'ydi muallif Ben Voigt, manba
int va a = * f2 (t) bo'lishi kerak, aks holda f3 (a) tomonidan kiritilgan manzil qatorga ishora qilmaydi va keyingi ko'rsatkich arifmetik fáìlì
qo'shib qo'ydi muallif Ben Voigt, manba
@Brad ADDRESS haqida gapirish foydali bo'lishi mumkin. Ikkala ko'rsatgich va zikr qilish ham ichki manzilga ajratilgan manzilga bog'liq bo'lib, farq shundaki, har ikkala pointer va murojaatlar ham manzilga, ham qiymatga kirishga ruxsat berganda, murojaatlar qiymatga qaratilgan va ko'rsatgichlar manzilga yo'naltirilgan.
qo'shib qo'ydi muallif Ben Voigt, manba
@BenVoigt yaxshi nuqtasi! Malumot liniyasini tahrirladim: int & a (* f2 (t));
qo'shib qo'ydi muallif Rama, manba
f2 (t) , albatta, f2 (& t [0])
qo'shib qo'ydi muallif ssell, manba
int * t [2] mos yozuvlar olish uchun f1 kodi foydalanadi * , so'ngra keyingi elementga int qiymatini qaytaruvchi qatorni.
qo'shib qo'ydi muallif Brad Hansen, manba
f2 (va t [0]) funktsiyasi yordamida int * t [1] , f3 (* (int * t [1])) int * t [2] funktsiyasini qaytaradi va f1 (int * t [2]) t [2] + 1 .
qo'shib qo'ydi muallif Brad Hansen, manba
@BenVoigt Men nima deyayotganingizni ko'ryapman. Agar u bu turdagi mos yozuvlar qiymatini qabul qilsa, u faqat f2 dan qaytish qiymati sifatida kerak bo'ladi.
qo'shib qo'ydi muallif Brad Hansen, manba
aniq tushuntirish uchun sizga katta rahmat. Mening oxirgi savolim bor. "F1" funktsiyasi uchun. T qiymati [3] ni tanlab, qiymatini qo'shib, int qiymatini 3 qaytaradi?
qo'shib qo'ydi muallif Brad Hansen, manba
  • f2(t) is &t[0] + 1 which is &t[1]
  • *(&t[1]) is t[1]
  • f3(t[1]) is &t[1] + 1 which is &t[2]
  • f1(&t[2]) is t[2] + 1 which is 3
0
qo'shib qo'ydi
f2() ning natijasini tushuntirishga javoban mening javobimni qayta ko'rib chiqish kerakligini ko'rmoqdaman. Rahmat!
qo'shib qo'ydi muallif Brad Hansen, manba
  • f2(t) is &t[0] + 1 which is &t[1]
  • *(&t[1]) is t[1]
  • f3(t[1]) is &t[1] + 1 which is &t[2]
  • f1(&t[2]) is t[2] + 1 which is 3
0
qo'shib qo'ydi
f2() ning natijasini tushuntirishga javoban mening javobimni qayta ko'rib chiqish kerakligini ko'rmoqdaman. Rahmat!
qo'shib qo'ydi muallif Brad Hansen, manba

Rama, Ben Voigt va boshqalarning yordami bilan katta miqdorda yordam. Men bu muammolarni chindan ham bartaraf eta olganimga ishonaman. Umid qilamanki, bu boshqalarga yordam beradi.

Asosiy() dan boshlab:

int t[] = {0, 1, 2, 3};

T nomi bilan bir qator to'rt element (0, 1, 2 va 3) bilan to'ldiriladi. T [0] = 0 , T [1] = 1 , t [2] = 2 va t [3 ] = 3 .

cout << f1(f3(*f2(t)));

We want to print the final results of these nested functions. Their invocation order is first f2() which returns its value to f3() which returns its value to f1() the value of which is printed with cout. So the resulting value returned from f1() will determine our final output. The t array is supplied as an argument to f2() which without an element represents a reference to the first element of the array, essentially &t[0]. Now we jump to f2() to begin!

int *f2(int *a)

This function will return a type of pointer int *. It is accepting an actual argument of the same type. In this case int *a = &t[0], the pointer a has been set to the reference of the first element of the t array.

return a + 1;

The variable a which currently holds a pointer to the address of &t[0] is incremented by 1, which in this case changes the pointer to the next element of the array, &t[1]. We now head to f3()

int *f3(int &a)

The the argument of this function will not accept a pointer, it needs an int value to perform the & referencing operator on. Therefore the * dereferencing operator is used on the value returned from f2(t). Dereferencing $t[1] results in just the element itself t[1] that can be passed by reference to f3() via the int &a argument.

return &a + 1;

a ning mos yozuvlar qiymati bir t [2] qatoridagi keyingi elementga bitta to'liq sonning xotirasi qiymatini ko'chirib olib, ketma-ketlik bilan oshiriladi va incremented mos yozuvlar qiymati ko'rsatkich sifatida. f1() ga qayting!

int f1(int *a)

Bu funksiya ekranga yoziladigan tamsayıni qaytaradi. t [2] uchun ishora ning int pointer argumentiga mos keladi.

return *a + 1;

Qaytish bayoni * uning qiymatini olish uchun markerni t [2] ga o'zgartiradi. T [2] = 2 yuqoridagi qatorni boshlashiga ko'ra, t [2] + 1 == 3 . Qiymat qaytariladi va cout 3 yozishga ruxsat beradi.

Har kimga katta yordam berganingiz uchun tashakkur.

0
qo'shib qo'ydi

Rama, Ben Voigt va boshqalarning yordami bilan katta miqdorda yordam. Men bu muammolarni chindan ham bartaraf eta olganimga ishonaman. Umid qilamanki, bu boshqalarga yordam beradi.

Asosiy() dan boshlab:

int t[] = {0, 1, 2, 3};

T nomi bilan bir qator to'rt element (0, 1, 2 va 3) bilan to'ldiriladi. T [0] = 0 , T [1] = 1 , t [2] = 2 va t [3 ] = 3 .

cout << f1(f3(*f2(t)));

We want to print the final results of these nested functions. Their invocation order is first f2() which returns its value to f3() which returns its value to f1() the value of which is printed with cout. So the resulting value returned from f1() will determine our final output. The t array is supplied as an argument to f2() which without an element represents a reference to the first element of the array, essentially &t[0]. Now we jump to f2() to begin!

int *f2(int *a)

This function will return a type of pointer int *. It is accepting an actual argument of the same type. In this case int *a = &t[0], the pointer a has been set to the reference of the first element of the t array.

return a + 1;

The variable a which currently holds a pointer to the address of &t[0] is incremented by 1, which in this case changes the pointer to the next element of the array, &t[1]. We now head to f3()

int *f3(int &a)

The the argument of this function will not accept a pointer, it needs an int value to perform the & referencing operator on. Therefore the * dereferencing operator is used on the value returned from f2(t). Dereferencing $t[1] results in just the element itself t[1] that can be passed by reference to f3() via the int &a argument.

return &a + 1;

a ning mos yozuvlar qiymati bir t [2] qatoridagi keyingi elementga bitta to'liq sonning xotirasi qiymatini ko'chirib olib, ketma-ketlik bilan oshiriladi va incremented mos yozuvlar qiymati ko'rsatkich sifatida. f1() ga qayting!

int f1(int *a)

Bu funksiya ekranga yoziladigan tamsayıni qaytaradi. t [2] uchun ishora ning int pointer argumentiga mos keladi.

return *a + 1;

Qaytish bayoni * uning qiymatini olish uchun markerni t [2] ga o'zgartiradi. T [2] = 2 yuqoridagi qatorni boshlashiga ko'ra, t [2] + 1 == 3 . Qiymat qaytariladi va cout 3 yozishga ruxsat beradi.

Har kimga katta yordam berganingiz uchun tashakkur.

0
qo'shib qo'ydi