Saya ingin menambah dua variabel dalam a for
kondisi -loop, bukan satu.
Jadi sesuatu seperti:
for (int i = 0; i != 5; ++i and ++j)
do_something(i, j);
Apa sintaks untuk ini?
Saya ingin menambah dua variabel dalam a for
kondisi -loop, bukan satu.
Jadi sesuatu seperti:
for (int i = 0; i != 5; ++i and ++j)
do_something(i, j);
Apa sintaks untuk ini?
Jawaban:
Idiom umum adalah menggunakan operator koma yang mengevaluasi kedua operan, dan mengembalikan operan kedua. Jadi:
for(int i = 0; i != 5; ++i,++j)
do_something(i,j);
Sekarang setelah menulis itu, seorang pemberi komentar menyarankan itu sebenarnya adalah gula sintaksis khusus dalam pernyataan for, dan bukan operator koma sama sekali. Saya memeriksanya di GCC sebagai berikut:
int i=0;
int a=5;
int x=0;
for(i; i<5; x=i++,a++){
printf("i=%d a=%d x=%d\n",i,a,x);
}
Saya mengharapkan x untuk mengambil nilai asli dari a, jadi seharusnya menampilkan 5,6,7 .. untuk x. Apa yang saya dapatkan adalah ini
i=0 a=5 x=0
i=1 a=6 x=0
i=2 a=7 x=1
i=3 a=8 x=2
i=4 a=9 x=3
Namun, jika saya mengurung ekspresi untuk memaksa pengurai benar-benar melihat operator koma, saya mengerti ini
int main(){
int i=0;
int a=5;
int x=0;
for(i=0; i<5; x=(i++,a++)){
printf("i=%d a=%d x=%d\n",i,a,x);
}
}
i=0 a=5 x=0
i=1 a=6 x=5
i=2 a=7 x=6
i=3 a=8 x=7
i=4 a=9 x=8
Awalnya saya pikir ini menunjukkan bahwa ini tidak berperilaku sebagai operator koma sama sekali, tetapi ternyata, ini hanyalah masalah prioritas - operator koma memiliki kemungkinan prioritas terendah , jadi ekspresi x = i ++, a ++ efektif diuraikan sebagai (x = i ++), a ++
Terima kasih atas semua komentarnya, itu adalah pengalaman belajar yang menarik, dan saya telah menggunakan C selama bertahun-tahun!
Coba ini
for(int i = 0; i != 5; ++i, ++j)
do_something(i,j);
for( ; ; ((++i), (++j)) )
for(int i = 0; i != 5; (++i)) {
Tanda kurung tambahan mengelabui compiler agar mengira ini bukan operasi "increment" lagi.
Cobalah untuk tidak melakukannya!
Dari http://www.research.att.com/~bs/JSF-AV-rules.pdf :
Aturan AV 199
Ekspresi increment dalam loop for tidak akan melakukan tindakan selain mengubah parameter loop tunggal ke nilai loop berikutnya.Rasional: Keterbacaan.
Saya datang ke sini untuk mengingatkan diri saya sendiri bagaimana membuat kode indeks kedua ke dalam klausa kenaikan dari loop FOR, yang saya tahu dapat dilakukan terutama dari mengamati dalam sampel yang saya masukkan ke dalam proyek lain, yang ditulis dalam C ++.
Hari ini, saya bekerja di C #, tetapi saya merasa yakin bahwa ia akan mematuhi aturan yang sama dalam hal ini, karena pernyataan FOR adalah salah satu struktur kontrol tertua di semua pemrograman. Untungnya, baru-baru ini saya menghabiskan beberapa hari dengan tepat mendokumentasikan perilaku loop FOR di salah satu program C saya yang lebih lama, dan saya segera menyadari bahwa studi tersebut berisi pelajaran yang diterapkan pada masalah C # saat ini, khususnya pada perilaku variabel indeks kedua. .
Bagi yang kurang waspada, berikut rangkuman pengamatan saya. Semua yang saya lihat terjadi hari ini, dengan mengamati variabel dengan cermat di jendela Lokal, menegaskan harapan saya bahwa pernyataan C # FOR berperilaku persis seperti pernyataan C atau C ++ FOR.
Jika salah satu variabel indeks Anda tetap berada dalam cakupan saat pengulangan berakhir, nilainya akan menjadi satu lebih tinggi dari ambang batas yang menghentikan pengulangan, dalam kasus variabel indeks yang sebenarnya. Demikian juga, jika, misalnya, variabel kedua diinisialisasi ke nol sebelum pengulangan dimasukkan, nilainya di akhir adalah hitungan iterasi, dengan asumsi bahwa itu adalah kenaikan (++), bukan penurunan, dan tidak ada badan loop mengubah nilainya.
Saya setuju dengan squelart. Menambahkan dua variabel rawan bug, terutama jika Anda hanya menguji salah satunya.
Ini adalah cara yang dapat dibaca untuk melakukan ini:
int j = 0;
for(int i = 0; i < 5; ++i) {
do_something(i, j);
++j;
}
For
loop dimaksudkan untuk kasus di mana loop Anda berjalan pada satu variabel naik / turun. Untuk variabel lain, ubah di loop.
Jika Anda perlu j
terikat i
, mengapa tidak membiarkan variabel asli apa adanya dan menambahkan i
?
for(int i = 0; i < 5; ++i) {
do_something(i,a+i);
}
Jika logika Anda lebih kompleks (misalnya, Anda harus benar-benar memantau lebih dari satu variabel), saya akan menggunakan while
loop.
int main(){
int i=0;
int a=0;
for(i;i<5;i++,a++){
printf("%d %d\n",a,i);
}
}
i
dan a
lokal ke loop?
Gunakan Matematika. Jika dua operasi secara matematis bergantung pada perulangan, mengapa tidak dilakukan matematika?
int i, j;//That have some meaningful values in them?
for( int counter = 0; counter < count_max; ++counter )
do_something (counter+i, counter+j);
Atau, lebih spesifik mengacu pada contoh OP:
for(int i = 0; i != 5; ++i)
do_something(i, j+i);
Terutama jika Anda meneruskan ke fungsi berdasarkan nilai, maka Anda harus mendapatkan sesuatu yang melakukan apa yang Anda inginkan.