logo

L – qiymatli va R -qiymatli havolalar

Загружено в:

20.11.2024

Скачано:

0

Размер:

26.6591796875 KB
Reja:
1.l-qiymatli va r-qiymatli havolalar bilan tanishish
2. C++ tilida l-qiymatli va r-qiymatli murojaatlarni  farqlash
3. C++ dasturlashda l-qiymatlarining rolini tushunish
4.Xulosa: C++  tilida  lvalue  (chap  qiymat)   va  rvalue  (o'ng qiymat)  tushunchalari  juda
muhimdir.   Bu   tushunchalar,   ayniqsa,   C++11   dan   boshlab   kiritilgan   rvalue
references   (o'ng   qiymatli   havolalar)   va   move   semantics   (ko'chirish   semantikasi)
bilan yanada kengaytirilgan.
Misollar
lvalue va rvalue
 lvalue : Bu xotirada manzili mavjud bo'lgan ob'ektni anglatadi. Uni o'ng tomonda yoki chap 
tomonda ishlatish mumkin. Masalan, o'zgaruvchilar lvalue hisoblanadi.
 rvalue : Bu vaqtinchalik qiymat yoki ifodaning natijasidir. Uni faqat o'ng tomonda ishlatish 
mumkin. Masalan, literallar (raqamlar kabi) rvalue hisoblanadi.
lvalue references va rvalue references
 lvalue reference  ( T& ): Bu o'zgaruvchi yoki ob'ektni ifodalash uchun ishlatiladi.
 rvalue reference  ( T&& ): Bu vaqtinchalik ob'ektlar bilan ishlash va ularni samarali ko'chirish 
uchun ishlatiladi.
Quyida lvalue va rvalue references bilan bir necha misollar keltirilgan:
#include <iostream>
void modify(int& x) {
    x = x + 10;
}
int main() {
    int a = 5;
    modify(a);  // 'a' lvalue sifatida uzatiladi
    std::cout << "a: " << a << std::endl;  // a: 15
    return 0;
}
#include <iostream> using namespace std;
int main() {
    int a = 10; // 'a' bu L-qiymatli havola, '10' esa R-qiymatli havola
    int b = 20; // 'b' bu L-qiymatli havola, '20' esa R-qiymatli havola
    a = b; // Bu yerda 'a' L-qiymatli havola, 'b' esa R-qiymatli havola
    b = a + 10; // Bu yerda 'b' L-qiymatli havola, 'a + 10' esa R-qiymatli havola
    cout << "a: " << a << endl; // a: 20
    cout << "b: " << b << endl; // b: 30
    // Misol sifatida L-qiymatli havolani o'zgartirish
    a = 15;
    cout << "a: " << a << endl; // a: 15
    // L-qiymatli havola sifatida massiv elementi
    int arr[3] = {1, 2, 3};
    arr[0] = 5; // arr[0] bu L-qiymatli havola
    cout << "arr[0]: " << arr[0] << endl; // arr[0]: 5
    return 0;
}
Yuqoridagi   kodlar   C++   da   lvalue   va   rvalue   tushunchalarini   hamda   ularning   referenslari   bilan   ishlashni
tushunishga yordam beradi.
2.C++ tilida i-qiymatli va r-qiymatli murojaatlarni farqlash: C++   tilida   lvalue   (chap   qiymat)   va   rvalue   (o'ng   qiymat)   tushunchalarini
tushunish, ularning farqlarini aniqlash va ularga nisbatan murojaatlar bilan ishlash
dasturchilar   uchun   muhimdir.   Quyida   lvalue   va   rvalue   tushunchalari,   ularni
farqlash va murojaat qilish usullari haqida aniq ma'lumot keltirilgan.
Funksiya prototiplarini lvalue va rvalue references bilan farqlash va chaqirish:
#include <iostream>
void print(int& x) {
    std::cout << "lvalue reference: " << x << std::endl;
}
void print(int&& x) {
    std::cout << "rvalue reference: " << x << std::endl;
}
int main() {
    int a = 10;
    print(a);       
    print(20);       
    print(std::move(a)); 
    return 0;
} #include <iostream>
#include <vector>
using namespace std;
void printVector(vector<int>& v) {
    cout << "L-qiymatli havola: ";
    for (int n : v) {
        cout << n << " ";
    }
    cout << endl;
}
void printVector(vector<int>&& v) {
    cout << "R-qiymatli havola: ";
    for (int n : v) {
        cout << n << " ";
    }
    cout << endl;
}
int main() {
    vector<int> vec = {1, 2, 3, 4, 5};
    printVector(vec);           // L-qiymatli havola
    printVector(move(vec));     // R-qiymatli havola     return 0;
}
C++   tilida   lvalue   va   rvalue   tushunchalari   muhim   ahamiyatga   ega   bo'lib,
ularni   farqlash   va   ulardan   to'g'ri   foydalanish   dastur   samaradorligini   oshiradi.
Lvalue   references   o'zgaruvchilar   va   ob'ektlarga   murojaat   qilish   uchun   ishlatilsa,
rvalue   references   vaqtinchalik   ob'ektlar   va   qiymatlarni   samarali   ko'chirish   uchun
ishlatiladi.
3. C++ dasturlashda l-qiymatlarining rolini tushunish
ChatGPT
C++ dasturlash tilida lvalue (chap qiymat) tushunchasi muhim rol o'ynaydi. Lvalue'lar xotirada joylashgan
va manzili bor bo'lgan ob'ektlarni ifodalaydi. Ular C++ dasturlashda o'zgaruvchilar, massiv elementlari, 
ob'ektlarning a'zolari va boshqa manzilga ega bo'lgan konstruktlar uchun ishlatiladi.
Xotira manzili : 
Lvalue xotirada ma'lum bir manzilga ega bo'lgan ob'ektni anglatadi. Bu ob'ektlarga biz dastur davomida 
murojaat qila olamiz va ularni o'zgartira olamiz.
Misol:
int a = 10;  // 'a' lvalue, '10' rvalue
int* p = &a; // 'a' ning manzilini 'p'  yuklaymiz
O'zgartirilishi mumkin :
 Lvalue'lar o'zgartirilishi mumkin. Masalan, o'zgaruvchilarni boshqa qiymatlar bilan yangilashimiz 
mumkin.
int a = 10;
a = 20;  // 'a' lvalue, '20' rvalue
Chap tomonda ishlatilishi : 
Lvalue'lar topshiriq operatorining chap tomonda (left-hand side) ishlatilishi mumkin, chunki ular 
manzilga ega va qiymat yuklash uchun mos keladi.
Misol:
int a;
a = 30;  // 'a' lvalue, '30' rvalue
Referenslar bilan ishlash :
 Lvalue'lar referenslarga (havolalarga) o'zlashtirilishi mumkin, bu orqali boshqa ob'ektlarga manzili orqali
murojaat qilish imkonini beradi. int a = 10;
int& ref = a;  // 'ref' lvalue reference, 'a' lvalue
ref = 15;     // 'a' ning qiymati endi 15
#include <iostream>
using namespace std;
int main() {
    int a = 5;       
    int b = 10;      
    a = b;          
    int c = a + b;    
    cout << "a: " << a << endl;  // a: 10
    cout << "b: " << b << endl;  // b: 10
    cout << "c: " << c << endl;  // c: 20
    return 0;
}
Ko'chirish semantikasi : 
Lvalue'lar   ko'chirish   semantikasida   ishlatiladi.   Masalan,   std::move   funksiyasi   orqali   lvalue'ni
rvalue'ga o'zgartirish mumkin, bu esa resurslarni samarali ko'chirish imkonini beradi.
#include <iostream>
#include <utility> // std::move uchun kerak class MyClass {
public:
    MyClass() {
        data = new int[10];
        std::cout << "Constructor" << std::endl;
    }
    
    ~MyClass() {
        delete[] data;
        std::cout << "Destructor" << std::endl;
    }
    // Move constructor
    MyClass(MyClass&& other) noexcept {
        data = other.data;
        other.data = nullptr;
        std::cout << "Move Constructor" << std::endl;
    }
    // Move assignment operator
    MyClass& operator=(MyClass&& other) noexcept {
        if (this != &other) {
            delete[] data;
            data = other.data;
            other.data = nullptr;
            std::cout << "Move Assignment" << std::endl;
        }
        return *this;
    } private:
    int* data;
};
int main() {
    MyClass obj1;
    MyClass obj2 = std::move(obj1); // Move constructor chaqiriladi
    MyClass obj3;
    obj3 = std::move(obj2); // Move assignment operator chaqiriladi
    return 0;
}
C++ tilida lvalue'lar dasturda xotiraga ega bo'lgan va o'zgartirilishi mumkin bo'lgan ob'ektlarni ifodalaydi.
Ular ko'pincha chap tomonda ishlatiladi, referenslar bilan bog'lanadi va ko'chirish semantikasida muhim
rol   o'ynaydi.   Lvalue'larni   tushunish   va   ulardan   to'g'ri   foydalanish   samarali   va   optimal   kod   yozishga
yordam beradi.
Xulosa
 Lvalue   va   rvalue   tushunchalari   C ++  tilida   ob ' ektlarni   va   qiymatlarni   boshqarishning   asosiy  
qismini   tashkil   etadi .
 Lvalue references  lvalue ob'ektlariga murojaat qiladi va ularni o'zgartirish imkonini beradi.
 Rvalue references  vaqtinchalik qiymatlarga murojaat qiladi va ko'chirish semantikasi bilan 
ishlaydi.
 Ko'chirish semantikasi  va  std::move  funksiyasi resurslarni samarali ko'chirish imkonini 
beradi.
Ushbu tushunchalarni tushunish va ulardan to'g'ri foydalanish, samarali va optimal kod yozishga yordam 
beradi.
#include <iostream>
using namespace std;
int main() {
    int x = 5;       int y = 7;   
    x = y + 3;   
    cout << "x: " << x << endl;  // x: 10
    return 0;
}
L-qiymatli havola sifatida massiv elementi
#include <iostream>
using namespace std;
int main() {
    int arr[3] = {1, 2, 3};  
    arr[0] = 10;            
    cout << "arr[0]: " << arr[0] << endl;  // arr[0]: 10
    return 0;
}
L-qiymatli va R-qiymatli havolalar bilan funksiyalar
#include <iostream>
using namespace std;
void setToTen(int& x) {  // L-qiymatli havola qabul qiluvchi funksiya
    x = 10;
}
int main() {
    int a = 5;     setToTen(a);         // 'a' bu L-qiymatli havola
    cout << "a: " << a << endl;  // a: 10
    return 0;
}
Yuqoridagi misollar orqali L - qiymatli va R - qiymatli havolalar qanday ishlashini tushunish mumkin. L -
qiymatli   havolalar   o'zgarishi   mumkin   bo'lgan   manzillarni   ifodalaydi,   R   -   qiymatli   havolalar   esa   o'ng
tomondagi qiymatlar yoki vaqtinchalik obyektlar sifatida ishlatiladi.
Foydalanilgan adabiyotlar ro yxatiʻ
1.  Ахо ,  Альфред ,  В .,  Хопкрофт ,  Джон ,  Ульман ,  Джеффри ,  Д .   Структуры
данных   и   алгоритмы.:   Пер.   с   англ.:   Уч.   Пос.   –   М.     Издательский   дом
«Вильямс», 2000. – 384 с.: ил. – Парал.  Титю англ.
  2.   To ‘ rayev   H . T .   Matematik   mantiq   va   diskret   matematika .:   Oliy   ta ’ lim
muassasalarining   talabalari   uchun   darslik :   11   jildlik .   H . T .     To ‘ rayev ,   1.   Azizov ;
H . T .   To ' rayevning   umumiy   tahriri   ostida ;     O ‘ zR   Oliy   va   o ‘ rta - maxsus   ta ’ lim
vazirligi . -  Toshkent :   Tafakkur - Bo ‘ stoni , 2011. - 288  bet 3. Клейнберг Дж., Тардос Е. К48 Алгоритмы: разработка и  применение.
Классика  Computers   Science  / Пер. с англ. Е.  Матвеева. — СПб.: Питер, 2016.
— 800 с.: ил. — (Серия  «Классика  computer   science »).
4. Пышкин Е.В. Структуры данных и алгоритмы: реализация  на  C / C ++. -
СПб.: ФТК СПБГПУ, 2009.- 200 с., ил.
5.   Овсянников,   А.   В.   Алгоритмы   и   структуры   данных   :   учебно-
методический   комплекс   для   специальности   1-31   03   07     «Прикладная
информатика (по направлениям)». Ч. 1 / А. В.
6.   Домнин   Л.   Н.   Элементы   теории   графов:   учеб.   Пособие   /   Л.     Н.
Домнин. – Пенза: Изд-во Пенз. Гос.  Ун-та, 2007. – 144 с.
Internet tarmoqlari:
1. https://uzbekdevs.uz/darsliklar/cpp/cpp-da-sinflar-obektlar   
2. https://uzbekdevs.uz/darsliklar/cpp/cpp-da-funksiya    .
3 . https://www.geeksforgeeks.org/lvalues-references-and-rvalues-references-in-c-with-
examples/
4 . https://www.oreilly.com/library/view/c-in-a/059600298X/ch03s01.html

Reja: 1.l-qiymatli va r-qiymatli havolalar bilan tanishish 2. C++ tilida l-qiymatli va r-qiymatli murojaatlarni farqlash 3. C++ dasturlashda l-qiymatlarining rolini tushunish 4.Xulosa:

C++ tilida lvalue (chap qiymat) va rvalue (o'ng qiymat) tushunchalari juda muhimdir. Bu tushunchalar, ayniqsa, C++11 dan boshlab kiritilgan rvalue references (o'ng qiymatli havolalar) va move semantics (ko'chirish semantikasi) bilan yanada kengaytirilgan. Misollar lvalue va rvalue  lvalue : Bu xotirada manzili mavjud bo'lgan ob'ektni anglatadi. Uni o'ng tomonda yoki chap tomonda ishlatish mumkin. Masalan, o'zgaruvchilar lvalue hisoblanadi.  rvalue : Bu vaqtinchalik qiymat yoki ifodaning natijasidir. Uni faqat o'ng tomonda ishlatish mumkin. Masalan, literallar (raqamlar kabi) rvalue hisoblanadi. lvalue references va rvalue references  lvalue reference ( T& ): Bu o'zgaruvchi yoki ob'ektni ifodalash uchun ishlatiladi.  rvalue reference ( T&& ): Bu vaqtinchalik ob'ektlar bilan ishlash va ularni samarali ko'chirish uchun ishlatiladi. Quyida lvalue va rvalue references bilan bir necha misollar keltirilgan: #include <iostream> void modify(int& x) { x = x + 10; } int main() { int a = 5; modify(a); // 'a' lvalue sifatida uzatiladi std::cout << "a: " << a << std::endl; // a: 15 return 0; } #include <iostream>

using namespace std; int main() { int a = 10; // 'a' bu L-qiymatli havola, '10' esa R-qiymatli havola int b = 20; // 'b' bu L-qiymatli havola, '20' esa R-qiymatli havola a = b; // Bu yerda 'a' L-qiymatli havola, 'b' esa R-qiymatli havola b = a + 10; // Bu yerda 'b' L-qiymatli havola, 'a + 10' esa R-qiymatli havola cout << "a: " << a << endl; // a: 20 cout << "b: " << b << endl; // b: 30 // Misol sifatida L-qiymatli havolani o'zgartirish a = 15; cout << "a: " << a << endl; // a: 15 // L-qiymatli havola sifatida massiv elementi int arr[3] = {1, 2, 3}; arr[0] = 5; // arr[0] bu L-qiymatli havola cout << "arr[0]: " << arr[0] << endl; // arr[0]: 5 return 0; } Yuqoridagi kodlar C++ da lvalue va rvalue tushunchalarini hamda ularning referenslari bilan ishlashni tushunishga yordam beradi. 2.C++ tilida i-qiymatli va r-qiymatli murojaatlarni farqlash:

C++ tilida lvalue (chap qiymat) va rvalue (o'ng qiymat) tushunchalarini tushunish, ularning farqlarini aniqlash va ularga nisbatan murojaatlar bilan ishlash dasturchilar uchun muhimdir. Quyida lvalue va rvalue tushunchalari, ularni farqlash va murojaat qilish usullari haqida aniq ma'lumot keltirilgan. Funksiya prototiplarini lvalue va rvalue references bilan farqlash va chaqirish: #include <iostream> void print(int& x) { std::cout << "lvalue reference: " << x << std::endl; } void print(int&& x) { std::cout << "rvalue reference: " << x << std::endl; } int main() { int a = 10; print(a); print(20); print(std::move(a)); return 0; }

#include <iostream> #include <vector> using namespace std; void printVector(vector<int>& v) { cout << "L-qiymatli havola: "; for (int n : v) { cout << n << " "; } cout << endl; } void printVector(vector<int>&& v) { cout << "R-qiymatli havola: "; for (int n : v) { cout << n << " "; } cout << endl; } int main() { vector<int> vec = {1, 2, 3, 4, 5}; printVector(vec); // L-qiymatli havola printVector(move(vec)); // R-qiymatli havola