Halo, dan selamat datang kembali.
Dalam kuliah ini, saya ingin berbicara tentang beberapa kesalahan umum yang akan Anda buat
saat memprogram di c.
Beberapa di antaranya mungkin sudah Anda kenal dari tantangan
sebelumnya, dan Anda sebenarnya pernah mengalami kesalahan ini, tetapi ini
adalah jenis kesalahan yang paling umum.
Yang pertama sangat, sangat jelas. Tidak ada titik koma.
Ingat bahwa semua pernyataan di c akan diakhiri dengan titik koma.
Jika Anda tidak memilikinya di sana, kompiler akan mengeluh.
Jadi salah menempatkan titik koma atau melewatkan titik koma sepenuhnya adalah
kesalahan yang sangat umum. Dalam hal ini, kita salah menempatkan titik koma.
Kami memiliki pernyataan if. Kami menempatkan titik koma di akhir pernyataan if.
Dan ini sebenarnya menyebabkan perilaku program menjadi sangat berbeda.
Ini benar-benar akan dikompilasi.
Ketika Anda melewatkan titik koma dan bahkan tidak memasukkannya, itu tidak akan dikompilasi.
Tetapi dalam kasus ini, nilai j akan selalu diset ke
nol karena titik koma pada pernyataan if ditempatkan.
Jadi titik koma benar-benar valid untuk memilikinya setelah pernyataan if.
Ini sebenarnya mewakili pernyataan nol.
Dan oleh karena itu, Anda tidak memiliki kesalahan
oleh kompiler, tetapi ini akan menyebabkan masalah karena j tidak akan pernah disetel ke nol.
Dan jenis kesalahan ini juga bisa terjadi pada perulangan.
Ketika Anda memiliki loop dan Anda meletakkan titik koma
di akhir for loop dan kemudian Anda mungkin memiliki braket, di mana Anda
tidak memiliki braket karena Anda akan memiliki kesalahan jika Anda memiliki braket, sangat umum.
Satu lagi membingungkan operator yang sama dengan operator yang sama dengan yang sama.
Disebutkan secara khusus bahwa operator equals
equals tidak membandingkan string. Jadi jika Anda menggunakan equals equals ketika
Anda membandingkan string, itu tidak valid. Itu hanya akan membandingkan referensi.
Tetapi jika Anda benar-benar bermaksud menetapkan nilai ke variabel dan
sebagai gantinya menggunakan equals equals, Anda akan memiliki kompiler.
Sekarang jika Anda mencoba membandingkan dua item, seperti dua
bilangan bulat di dalam pernyataan if dan sebagai gantinya Anda menggunakan
operator penugasan, Anda sebenarnya tidak akan memiliki
kesalahan kompiler, tetapi ekspresi itu akan selalu bernilai true.
Jadi ketika Anda menggunakan persamaan dan Anda tidak menggunakan persamaan
dengan persamaan, ini biasanya dibuat dalam pernyataan if while do, di dalam ekspresi Boolean.
Dan ini valid kecuali memiliki
efek menugaskan sesuatu sebagai lawan mengeksekusi sesuatu.
Jadi dalam contoh
ini, jika kita memiliki jika a sama dengan 2, itu menugaskan 2 ke a.
Itu selalu disetel ke benar karena itu adalah pernyataan yang benar karena Anda
tidak pernah gagal saat mengerjakan tugas. Dan printf akan selalu berjalan.
Apa yang sebenarnya ingin Anda lakukan di sini adalah mengatakan jika a sama dengan.
Jadi sangat umum menggunakan equals sebagai lawan equals equals dan
kemudian tidak memiliki kesalahan kompiler.
Jika Anda menggunakan equals equals dalam situasi
yang salah, Anda mungkin
memiliki perilaku yang tidak terduga juga, tetapi Anda
akan memiliki kesalahan kompiler jika Anda salah menggunakannya untuk tugas.
Tapi hati-hati dengan ini dengan sama bukan sama sama.
Menghilangkan deklarasi prototipe.
Saya menyebutkan bahwa sangat penting untuk selalu mendeklarasikan fungsi Anda
di bagian atas file sebelum Anda menggunakannya.
Namun, ini tidak selalu terjadi dan itu adalah kesalahan yang sangat umum.
Dan biasanya, yang akan terjadi adalah Anda akan mendapatkan kesalahan deklarasi
implisit di kompiler.
Dalam contoh ini, jika Anda memiliki akar kuadrat yang ditentukan
kemudian dalam program daripada tempat Anda menjalankannya atau di file lain
dan Anda tidak mendeklarasikannya
secara eksplisit, Anda akan mendapatkan beberapa peringatan.
Kompiler akan mengasumsikan bahwa fungsi mengembalikan sebuah int.
Itu selalu paling aman untuk menyertakan deklarasi prototipe di bagian atas
untuk semua fungsi yang Anda
panggil, baik secara
eksplisit maupun implisit dengan menyertakan file header yang benar dalam program Anda.
Tetapi ketika Anda tidak memasukkannya, deklarasi prototipe tersebut dapat
menyebabkan kesalahan.
Gagal menyertakan file header yang menyertakan definisi untuk fungsi pustaka
pemrograman c yang digunakan dalam program.
Jadi dalam hal ini, Anda ingin menggunakan kembali beberapa kode. Mungkin Anda memiliki fungsi printf
yang ingin Anda tampilkan beberapa output, tetapi Anda tidak menyertakan file header lib standar.
Itu kesalahan. Dan itu biasanya akan diberitahukan kepada Anda oleh kompiler.
Akan ada masalah tautan dengan
fungsi itu.
Jadi dalam hal ini, kami memiliki jawaban ganda sama dengan nilai akar kuadrat 1.
Jika program ini tidak menyertakan matematika. file header, ini
akan menghasilkan kesalahan bahwa akar kuadrat tidak terdefinisi.
Ini akan mencoba menautkan file objek. Ini tidak akan memiliki matematika. Hai.
Dan itu akan berkata, hei, Anda memanggil akar kuadrat, tetapi tidak ada implementasi untuk itu.
Jadi, pastikan Anda menyertakan header yang
benar untuk semua pemanggilan fungsi, terutama dari pustaka standar.
Membingungkan konstanta karakter dalam string karakter.
Jadi di sini jika kita memiliki teks sama dengan tanda kutip tunggal
di dalam, itu adalah karakter tunggal yang ditetapkan untuk teks.
Jika kami memiliki variabel bernama teks dan kami menetapkan dalam tanda
kutip ganda, itu adalah penunjuk ke string karakter.
Itu tidak berlaku untuk satu
karakter.
Dan ini sebenarnya kita telah berbicara
tentang konstanta string dan menugaskannya ke array karakter.
Dan bagaimana Anda tidak bisa melakukannya dengan yang setara dan Anda
harus benar-benar melakukannya dengan salinan bintang.
Dalam hal ini, ketika kami mengatakan teks sama dengan a, itu menetapkan penunjuk dan
ini sebenarnya juga tidak valid dan lihat
apa yang harus Anda lakukan adalah Anda harus melakukan teks
bintang sama dengan a atau salinan bintang jika Anda tidak melakukannya 't ingin
menetapkan secara langsung seperti itu.
Tapi Anda mendapatkan intinya.
Menggunakan bagian dalam tanda kutip tunggal versus karakter di dalam tanda
kutip ganda sama sekali berbeda, karakter versus string.
Dalam kasus pertama, teks biasanya dideklarasikan sebagai variabel char.
Dan dalam kasus kedua, itu harus dideklarasikan sebagai penunjuk tipe ke char.
Dan jika Anda ingin menetapkan nilai ke penunjuk
itu selain penunjuk itu sendiri, Anda harus mereferensikannya.
Ini sebenarnya salah karena jika itu adalah
penunjuk alih-alih menetapkan alamat, Anda memberinya string, jadi itu tidak
masuk akal.
Menggunakan batas yang salah untuk larik, larik di luar batas pengecualian.
Di sini, kita mendeklarasikan array integer berukuran 100 dan kemudian beberapa
variabel I dan jumlah dengan hanya beberapa yang diinisialisasi.
Dan kita melalui loop kita, kita katakan untuk I sama dengan 1 I kurang dari sama dengan 100.
Itu salah karena ukuran seratus berarti ada seratus
elemen dalam array. Tapi array berbasis nol.
Jadi elemen pertama adalah nol. Indeks maksimum yang dapat
Anda tetapkan atau akses dalam array adalah 99.
Ini akan menjadi kurang dari sama.
Jadi, Anda akan melakukan kesalahan di luar batas di sini.
Ini bukan subskrip yang
valid karena loop ini akan mencapai 100.
Ini juga mungkin salah karena Anda memulai dari 1.
Jika Anda benar-benar menginginkan elemen pertama dari array ini, Anda akan mulai dari 0.
Lupa untuk memesan lokasi tambahan dalam array untuk
mengakhiri karakter null dari sebuah string
juga merupakan masalah umum.
Saat mendeklarasikan array karakter Anda, array tersebut harus cukup besar untuk menampung karakter yang mengakhiri saja.
Inilah mengapa saya menyarankan Anda untuk
tidak memasukkan ukuran ke dalam array saat Anda membuatnya jika Anda menginisialisasinya.
Anda hanya akan memasukkan ukuran di sana jika Anda tidak menginisialisasinya.
Jika Anda membuat inisialisasi pada baris yang sama, biarkan c melakukan pekerjaan untuk
Anda, itu akan secara otomatis menempatkan ukuran yang tepat dan itu akan menyertakan terminator nol itu.
Jadi misalnya, jika Anda memiliki string karakter yang
disebut hello, ini lebih dari lima lokasi memori, enam karena terminator nol di akhir.
Jangan lupa tentang ukuran array Anda.
Ini adalah masalah umum dengan pointer yang belum banyak kita bahas, tapi
saya ingin menyebutkannya karena itu sangat umum.
Dalam pointer, ketika Anda ingin mengakses atau bahkan menginstruksikan, ketika
Anda ingin mengakses sesuatu dengan
pointer, Anda harus menggunakan tanda hubung yang lebih besar dari simbol.
Itu digunakan saat Anda mengakses elemen pointer.
Jadi, jika Anda memiliki penunjuk yang menunjuk ke suatu struktur, begitulah cara Anda mengaksesnya.
Jika Anda memiliki struktur,
itu bukan pointer, maka Anda mengaksesnya menggunakan operator titik.
Sering kali operator titik ini dan tanda hubung ini kemudian lebih besar dari
digunakan secara tidak benar.
Titik untuk bukan penunjuk, tanda hubung penunjuk lebih besar dari, ini akan menjadi lebih
jelas di lebih banyak contoh kita.
Menghilangkan variabel ampersand sebelum non-penunjuk dalam panggilan scanf.
Jadi ingat panggilan scanf kita mengharapkan pointer sebagai argumen kedua, dan
itu berarti sebuah alamat.
Saat kita mendeklarasikan tipe data sebagai variabel bertipe int, itu
bukan pointer.
Jadi untuk mengizinkan scanf menyimpan data itu dalam variabel int kita, kita harus memberikannya ampersand
untuk mengatakan bahwa itu adalah sebuah alamat.
Jadi ini salah,
tidak memiliki ampersand sebelum angka dan pindai f sebagai
argumen kedua tidak valid. Satu-satunya waktu Anda tidak memiliki ampersand adalah jika Anda menggunakan
pointer, seperti array karakter.
Semua argumen yang muncul setelah format string dan scanf harus berupa pointer.
Menggunakan variabel pointer sebelum diinisialisasi.
Jadi, inilah contoh membuat pointer dan kemudian mencoba menetapkannya.
Dan ini adalah tugas yang benar di mana Anda menetapkan nilai yang Anda de-referensikan.
Tapi apa yang belum kita lakukan di sini adalah kita telah menginisialisasi pointer untuk benar-benar memiliki memori
yang dialokasikan untuk itu dan Anda tidak
dapat melakukan ini di c.
Anda hanya dapat menerapkan operator tipuan, yang
merupakan tanda bintang sebelum ke suatu titik
atau variabel setelah Anda menetapkan variabel yang menunjuk ke suatu tempat.
Jadi itu harus menunjuk ke suatu tempat, sekarang ini nol itu tidak menunjuk ke mana pun karena Anda
tidak mengalokasikan memori apa pun.
Jadi penunjuk char tidak pernah disetel untuk menunjuk ke apa pun sehingga penugasannya tidak berarti.
Ini sebenarnya akan menyebabkan kesalahan segmentasi.
Kesalahan umum lainnya adalah menghilangkan pernyataan break di akhir kasus dalam pernyataan switch.
Jika break tidak disertakan pada akhir kasus, maka eksekusi dilanjutkan ke kasus berikutnya.
Jadi inilah yang saya sebutkan di mana Anda memiliki kasus, itu akan dievaluasi.
Dan jika Anda tidak memiliki jeda di sana, itu akan
langsung ke kasus berikutnya dan akan mengeksekusi kode di dalam kasus berikutnya.
Jadi, Anda selalu ingin memiliki jeda di dalam pernyataan kasus Anda.
Ada kalanya Anda ingin memiliki kasus tindak lanjut ke kasus lain dan mereka
melakukan hal yang sama persis, dalam hal ini
Anda tidak akan memiliki apa pun di dalam pernyataan kasus.
Menyisipkan titik koma di akhir definisi praprosesor.
Definisi preprocessor ingat mulai dengan
angka, simbol pound. Preprocessor dijalankan sebelum compiler biasanya
untuk optimasi.
Sintaks yang benar untuk definisi praprosesor adalah tidak menyertakan titik koma.
Namun, di c you, biasakan untuk selalu meletakkan titik koma setelah semuanya.
Tetapi Anda harus ingat bahwa jika Anda mendefinisikan beberapa data konstan bahwa
Anda tidak memerlukan titik koma, ini salah.
Ini akan menyebabkan kesalahan sintaks jika
menggunakan ekspresi seperti itu.
seperti itu. Jadi, jika Anda benar-benar
mencoba menggunakannya untuk menemukannya, titik koma di akhir boleh saja.
Tetapi ketika praprosesor berjalan, itu akan menyisipkan persis apa yang ada dalam definisi itu.
Jadi itu akan melayani ke akhir data 999 titik dua.
Inilah yang akan dilihat oleh kompiler dan itu akan benar-benar menyebabkan kesalahan, itu
akan menjadi kesalahan sintaksis.
Menghilangkan tanda kurung tutup atau tanda kutip penutup pada
pernyataan apapun, sangat umum. Jadi ini juga berhubungan langsung dengan
tanda kurung, memiliki kurung kurawal awal dan kemudian tidak mengakhiri kurung kurawal, hal yang
sama dengan tanda kurung. Dalam hal ini,
kami memiliki dua atau tiga kurung kiri awal, tetapi kami
hanya memiliki dua kurung akhir. Kami kehilangan tanda kurung kanan akhir.
Itu akan menjadi kesalahan sintaks yang akan ditemukan oleh kompiler.
Jadi, saat Anda menggunakan sematan dalam tanda kurung untuk memisahkan setiap bagian persamaan, itu
membuat baris kode lebih mudah dibaca.
Anda ingin menggunakan tanda kurung.
Namun, Anda ingin memastikan semuanya cocok
dengan Anda memulai tanda kurung, Anda harus memiliki tanda kurung penutup, sama dengan kurung kurawal.
Anda memulai kurung kurawal, itu harus memiliki kurung kurawal akhir.
Jadi apakah Anda memiliki terlalu banyak atau Anda
memiliki terlalu sedikit tetapi kompiler akan mengeluh, dan ini sangat, sangat umum.
Jadi baris kedua di sini juga kehilangan tanda kutip penutup, pernyataan cetak ini.
Kami tidak memiliki kutipan akhir.
Kompiler akan mengeluh tentang itu.
Kedua hal ini akan menghasilkan kesalahan kompilasi.
Kadang-kadang meskipun kompiler sangat menyesatkan karena tidak benar-benar
tahu di mana kesalahan terjadi. Ia berpikir kesalahan mungkin telah terjadi pada baris berikutnya.
Jadi baris yang memberi tahu Anda kesalahannya mungkin menyesatkan.
Jadi tergantung pada apakah kompiler
menggunakan tanda kurung atau tanda kutip pada baris
berikutnya, itu benar-benar akan melengkapi ekspresi itu.
Jadi itu akan memindahkan kesalahan ke baris lain.
Dan itulah yang akan dikeluhkan dan dikatakan di situlah letak kesalahannya. Tetapi kesalahan sebenarnya
lebih tinggi di atas tempat Anda bermaksud meletakkannya.
Ini adalah beberapa kesalahan umum yang saya lihat banyak dilakukan oleh
programmer c.
Mereka mudah diperbaiki. Dan jika Anda memahaminya dan
mempelajari ini, Anda
akan tahu untuk tidak membuatnya. Tidak apa-apa untuk membuat
mereka sebagai pemula, tetapi ketika Anda membuat kode lebih dan
lebih dan mendapatkan lebih banyak latihan, Anda akan menyadari, hei, saya
lupa tanda kurung, saya lupa tanda kurung, saya tidak menggunakan sama dan sama dengan dengan
benar , Saya salah menggunakan pointer, saya tidak mengalokasikan memori apa pun.
Semua hal ini akan datang lebih alam kedua. Terima kasih.