Dapatkah saya menggunakan variabel penghitung yang sama untuk for
perulangan di dalam for
perulangan?
Atau akankah variabel mempengaruhi satu sama lain? Haruskah kode berikut menggunakan variabel yang berbeda untuk loop kedua, seperti j
, or is i
fine?
for(int i = 0; i < 10; i++)
{
for(int i = 0; i < 10; i++)
{
}
}
i
, dengan cakupan berbeda. Gunakan-Wshadow
dengan GCC agar masalah seperti itu dilaporkan secara otomatis.-Wshadow
tidak termasuk dalam-Wall
.-Wshadow
memperingatkan tentang membayangi variabel global, yang dapat dengan mudah mengganggu dalam proyek yang lebih besar.-Wextra
tidak termasuk-Wshadow
. Saya kira itu cukup umum di beberapa proyek, atau beberapa pengembang gcc suka membayangi sebagai gaya pengkodean, untuk menjamin ditinggalkan seperti ini.-Wshadow
memiliki tingkat positif palsu yang menghebohkan, membuatnya sama sekali tidak berguna. Cakupan ada karena suatu alasan, dan shadowing secara apriori tidak bermasalah. Sekarang-Wshadow-local
(catatan: tidak-Wshadow=local
) sangat berbeda. Namun sayangnya GCC sejauh ini menolak untuk memasukkannya ke dalam trunk (meskipun tampaknya ada garpu GCC yang menyertakannya).Jawaban:
Anda dapat menggunakan nama yang sama (pengenal). Ini akan menjadi objek yang berbeda. Mereka tidak akan saling mempengaruhi. Di dalam loop dalam, tidak ada cara untuk merujuk ke objek yang digunakan di loop luar (kecuali Anda membuat ketentuan khusus untuk itu, seperti dengan memberikan pointer ke objek tersebut).
Ini umumnya gaya yang buruk, cenderung membingungkan, dan harus dihindari.
Objek akan berbeda hanya jika bagian dalam ditentukan secara terpisah, seperti yang
int i
telah Anda tunjukkan. Jika nama yang sama digunakan tanpa mendefinisikan objek baru, loop akan menggunakan objek yang sama dan akan saling mengganggu.sumber
Pertama, ini benar-benar legal: kode akan mengkompilasi dan menjalankan, mengulangi isi loop bersarang 10 × 10 = 100 kali. Penghitung loop
i
di dalam loop bersarang akan menyembunyikan penghitung dari loop luar, sehingga dua penghitung akan bertambah secara independen satu sama lain.Sejak luar
i
tersembunyi, kode di dalam badan loop bersarang hanya akan memiliki akses ke nilai darii
loop bersarang, bukani
dari loop luar. Dalam situasi ketika loop bersarang tidak membutuhkan akses ke luar,i
kode seperti itu bisa dibenarkan dengan sempurna. Namun, hal ini kemungkinan akan membuat lebih banyak kebingungan pada pembacanya, jadi sebaiknya hindari menulis kode seperti itu untuk menghindari "kewajiban pemeliharaan".Catatan: Meskipun variabel penghitung dari kedua loop memiliki pengenal yang sama
i
, keduanya tetap merupakan dua variabel independen, yaitu Anda tidak menggunakan variabel yang sama di kedua loop. Menggunakan variabel yang sama di kedua loop juga dimungkinkan, tetapi kodenya akan sulit dibaca. Berikut ini contohnya:Sekarang kedua loop menggunakan variabel yang sama. Namun, dibutuhkan beberapa saat untuk mengetahui apa yang dilakukan kode ini tanpa mengkompilasinya ( demo );
sumber
int
loop for dalam, yaitu sebenarnya menggunakan variabel counter yang sama, akan menyebabkan loop luar hanya berjalan sekali, karena loop dalam akan keluari == 10
. Ini sepele, tetapi berpikir itu memberikan klarifikasi mengingat bagaimana pertanyaan itu dinyatakanKamu bisa. Tetapi Anda harus menyadari ruang lingkup
i
s. jika kita menyebut outeri
withi_1
dan inneri
withi_2
, maka cakupani
s adalah sebagai berikut:Anda harus memperhatikan bahwa mereka tidak mempengaruhi satu sama lain, dan hanya ruang lingkup definisinya yang berbeda.
sumber
Itu sepenuhnya mungkin tetapi perlu diingat, Anda tidak akan dapat menangani yang pertama dinyatakan i
di loop kedua dalam loop anak kedua
jika Anda perlu menyesuaikan atau mendapatkan nilai i pertama, gunakan j di loop kedua
dan jika Anda cukup kreatif, Anda dapat melakukan keduanya dalam satu putaran
sumber
Ya, Anda dapat menggunakan nama variabel penghitung yang sama untuk
for
loop dalam seperti untukfor
loop luar .Dari for loop :
Ruang lingkup loop_statement adalah bersarang dalam lingkup init_clause .
Dari C Standards # 6.8.5p5 Pernyataan Iterasi [penekanan saya]
Dari C Standards # 6.2.1p4 Cakupan pengidentifikasi [penekanan saya]
sumber
Dari perspektif kode / kompiler, ini akan menjadi hal yang sah dan sah untuk dilakukan. The
int i
dinyatakan dalam batinfor(int i = 0; i < 10; i++)
loop dalam lingkup baru dan lebih kecil, sehingga deklarasi bayangan deklarasiint i
di lingkaran luar (atau, dengan kata lain: Dalam lingkup batin semua akses ke variabeli
pergi keint i
dideklarasikan dalam lingkup batin, meninggalkanint i
di lingkup luar tidak tersentuh).Yang mengatakan, dari perspektif kualitas kode ini benar-benar mengerikan. Sulit dibaca, sulit dipahami, dan mudah salah paham. Jangan lakukan itu.
sumber
Ya, Anda dapat menggunakannya tetapi cukup membingungkan. Yang terpenting adalah ruang lingkup variabel lokal di dalam loop. Sejauh variabel dideklarasikan di dalam suatu fungsi, ruang lingkup variabel itu adalah fungsi itu.
Demikian pula halnya dengan loop, variabel yang dideklarasikan di dalam loop dalam memiliki cakupan yang berbeda dan variabel yang dideklarasikan loop luar memiliki cakupan yang berbeda.
Pendekatan yang lebih baik adalah dengan menggunakan variabel yang berbeda untuk loop dalam dan luar.
sumber
Ya pasti Anda bisa menggunakan variabel nama yang sama.
Variabel pemrograman C dapat dideklarasikan di tiga tempat:
variabel lokal: -Di dalam fungsi atau blok.
Variabel global: -Keluar dari semua fungsi.
Parameter formal: -Dalam parameter fungsi.
Tetapi dalam kasus Anda
i scope
harus memikirkan hal-hal di bawah iniCatatan: Ini akan menjadi praktik terbaik untuk menggunakan variabel yang berbeda untuk loop dalam dan luar
sumber
Ya - dan yang lebih menarik lagi, Anda dapat menggunakan kembali nama variabel setiap kali Anda membuka satu set tanda kurung. Ini sering kali berguna saat memasukkan kode diagnostik. Ketik tanda kurung kurawal buka '{' diikuti dengan deklarasi dan penggunaan variabel, kemudian tutup kurung kurawal dan variabel-variabel tersebut akan hilang. Ini menjamin bahwa Anda tidak akan mengganggu apa pun di badan utama sambil tetap mempertahankan keuntungan dari variabel, kelas, dan metode apa pun yang dideklarasikan di luar kurung kurawal.
sumber
Aturan Lingkup: Variabel yang dideklarasikan dalam pernyataan for hanya dapat digunakan dalam pernyataan itu dan badan perulangan.
Jika dalam kode Anda, Anda telah menentukan beberapa instance i di loop dalam, setiap instance akan menempati ruang memorinya sendiri. Jadi tidak ada yang perlu dikhawatirkan hasilnya akan sama.
Tetapi tidak disarankan untuk menggunakan nama variabel yang sama karena sulit untuk dipahami dan nantinya menjadi kode yang tidak dapat dipelihara.
sumber
Bagian penting adalah berisi parameter loop dalam
int i
. Karenai
didefinisikan ulang dengan cara ini, kedua variabel tidak saling mempengaruhi; cakupan mereka berbeda. Berikut dua contoh untuk menunjukkannya:Perhatikan bahwa kode di atas termasuk
int i
dalam parameter loop dalam, dan kode di bawah ini hanya menyertakani
.sumber
Nah, Anda dapat melakukan ini tanpa skrip Anda mengalami masalah, tetapi Anda harus menghindari struktur itu. Ini biasanya menyebabkan kebingungan
sumber