Di C, prototipe untuk fungsi nilai absolut (yang menerima float) adalah
float fabsf( float );
Mengapa prototipe ini tidak menerima nilai konstan, seperti ini:
float fabsf( float const );
fabsf tidak akan mengubah nilai input, kan?
Jika saya memiliki fungsi yang menerima input dan memanggil fabsf, apakah saya terpaksa menghindari menetapkan input sebagai const?
Apa cara yang tepat untuk menangani kebenaran const dalam situasi ini?
c
function
const
pass-by-value
pengguna24205
sumber
sumber
const
di sini berlebihan, apa yang Anda bayangkan sedang terjadi?const
sama sekali tidak berarti.float const x = -1.0; float y = fabsf(x);
sehingga tampaknya bagi saya bahwafabsf
tidak menerima input const. Tidak ada cara untuk mengatakan "Anda bisa memberi sayafloat
nilai tetapi Anda tidak bisa melewati nilaiconst float
." (Dan seperti yang kita lihat di jawaban, C tidak menyediakan cara untuk meminta agar input ke fungsi menjadi afloat const
.)Jawaban:
Edit
Sebagai MM berkomentar, pada parameter di prototipe tersebut
const
diabaikan. Sumber yang diedit dari jawaban asli (lihat di bawah) menunjukkan ini:Tidak ada pesan kesalahan.
Ngomong-ngomong, aku akan membiarkan yang asli tetap di tempat dengan harapan itu bisa membantu.
Asli
Pada
const
parameter membuat parameter ini read-only di dalam fungsi.Sebagai contoh:
Sumber ini tidak akan dikompilasi tanpa pesan kesalahan.
Fungsinya
correct()
akan membaca nilai yang diberikan, mengubah tandanya, dan mengembalikan nilai yang dinegasikan.Fungsi
erroneous()
tampaknya melakukan hal yang sama secara efektif, kecuali bahwa ada tugas untuk parameter. Tetapi sebagai parameterconst
ini tidak diperbolehkan.Selanjutnya, fungsinya
changer()
akan berfungsi seperti keduanya sebelumnya, tetapi tidak memberikan kesalahan.Mari kita lihat situs panggilan:
Variabel yang
f
diberikan sebagai argumen akan disalin ke dalam parametervalue
. Itu tidak akan pernah berubah bahkan jikachanger()
akan dipanggil.Anda mungkin ingin melihat parameter sebagai semacam variabel lokal. Sebenarnya mereka sebagian besar ditangani seperti ini dalam kode mesin yang dihasilkan.
Jadi, mengapa
const
terkadang Anda melihat ? Anda melihatnya jika pointer didefinisikan sebagai parameter.Saat Anda tidak ingin nilai yang ditunjukkan diubah, Anda perlu menambahkan
const
; tetapi lakukan pada posisi yang benar!sumber
float fabsf( float const );
tidak ada hubungannya dengan implementasi fungsi (yang tidak harus mengulangiconst
), pada kenyataannyaconst
diabaikan seluruhnya dalam prototipeC menggunakan pass by value. Nilai untuk parameter fungsi adalah salinan argumen yang Anda berikan.
Tidak masalah untuk menyalin float const dan non-const, dan hasilnya adalah float non-const.
Ini mirip dengan penugasan:
Bahkan, bahasa menetapkan bahwa nilai ekspresi tidak pernah bisa
const
, yaitu ketika nilai dibaca dari suatu variabel, nilai itu tidakconst
bahkan jika variabel itu.sumber
Karena bahasa C menggunakan semantik nilai lewat, argumen apa pun yang Anda berikan, sementara itu dapat dimodifikasi secara internal, tidak secara langsung memengaruhi nilai yang Anda masukkan.
Ini berarti dari sudut pandang penelepon,
float fabsf( float );
danfloat fabsf( const float );
sama. Jadi tidak ada gunanya membuat parameterconst
.Di mana ia tidak masuk akal untuk digunakan
const
adalah jika parameter Anda lulus dalam adalah pointer, misalnya:Fungsi ini, terlepas dari apa yang disarankan oleh namanya, dapat mengubah pointer yang diberikan dan memodifikasi apa yang ditunjukkannya, yaitu
str[0] = 'x'
, untuk menghasilkan perubahan yang dapat dilihat oleh fungsi panggilan. Jika fungsi ini didefinisikan seperti ini:Penelepon dipastikan bahwa fungsi tidak dapat melakukan modifikasi apa pun ke
str
poin.sumber
((char*)str)[0] = 'f'
. Theconst ... *
dalam daftar argumen karena itu hanya "deklarasi niat".Untuk menambahkan perspektif pengacara bahasa:
Itu berarti keduanya kompatibel:
Oleh karena itu Anda dapat menulis prototipe dengan atau tanpa
const
(yang berarti tanpa lebih masuk akal; kurang untuk mengetik / membaca) dan dapat menambahkanconst
definisi fungsi jika Anda ingin menghindari secara tidak sengaja memodifikasi parameter (nilai panggilan - disalin!) Di dalam fungsi tubuh.sumber