>> DAVID J. MALAN: Mari kita menulis program di yang kita cuba untuk menukar nilai-nilai
dua pembolehubah, x dan y.
Terlebih dahulu, saya telah menulis banyak program ini sudah.
Pertama, saya mengisytiharkan pembolehubah, x, dan menyimpan di dalamnya nilai, 1.
Kemudian saya mengisytiharkan pembolehubah y dan menyimpan di dalamnya nilai, 2.
>> Kemudian saya meneruskan printf untuk memaparkan nilai-nilai kedua-dua pembolehubah.
Kemudian saya menuntut dengan printf lain untuk bertukar-tukar mereka pembolehubah.
Kemudian saya memanggil fungsi yang dipanggil swap.
Dan kemudian saya menuntut bahawa pembolehubah telah ditukar.
Dan kemudian saya mencetak bahawa apa yang saya menuntut merupakan nilai-nilai baru x dan y.
>> Sekarang apa yang swap fungsi ini?
Ia bukan sesuatu yang datang dengan C. Malah, jika kita lihat di bahagian atas saya
fail, anda akan notis bahawa saya telah diisytiharkan prototaip untuk swap fungsi ini
yang menyatakan bahawa ia mengambil masa dua Ints, sewenang-wenangnya dipanggil a dan b, dan ini
fungsi tidak kembali apa-apa.
Jadi mungkin, ia melakukan apa yang ia berkata dalam pertukaran satu dan nilai-nilai b ini.
Sekarang mari kita melaksanakan swap.
>> Pertama, saya akan mengisytiharkan sementara berubah-ubah dan memberikan kepadanya
nilai dalam, walaupun saya boleh hanya sebagai mudah disimpan di dalamnya b.
Saya kemudian akan menukar nilai daripada menjadi sama dengan yang dalam b.
Dan kemudian akhir sekali, saya akan menukar nilai b untuk menjadi apa yang adalah tetapi
kini dalam temp.
>> Sekarang saya menuntut apa yang saya baru sahaja dilakukan adalah benar secara logik.
Saya disimpan dalam pembolehubah sementara, berubah itu nilai untuk menjadi b, dan kemudian
berubah nilai b untuk menjadi apa yang ini adalah satu.
Tetapi apabila saya menyusun dan menjalankan ini program, saya bimbang itu bukan
akan apa yang saya lihat.
>> Buat, tiada swap.
dot slash, tiada swap.
Dan malangnya, menurut printf, nilai x dan y, walaupun
selepas kami menuntut untuk bertukar-tukar mereka, masih 1 dan 2.
>> Sekarang mengapa itu?
Nah, ternyata bahawa dalam utama, apabila kita memanggil swap fungsi ini, lulus dalam
x dan y sebagai hujah, ia sebenarnya salinan x dan y yang
yang diserahkan swap.
Iaitu, nilai 1 dan 2 adalah diluluskan swap sebagai a dan b.
Dan ia a dan b bahawa kita akhirnya bertukar-tukar dalam kerja.
>> Iaitu, 1 menjadi 2, 2 menjadi 1.
Tetapi kerana swap tidak mempunyai nilai pulangan dan kerana ia menerima salinan x
dan y, ia tingkah laku telah kesan ke atas x dan y.
Sesungguhnya, a dan b adalah scoped, jadi untuk bercakap, untuk menukar, manakala x dan y kekal
scoped untuk utama.
>> Oleh itu, kita mempunyai masalah.
Tetapi bagaimana untuk memperbaikinya?