Hampir semua bahasa memiliki foreach
lingkaran atau sesuatu yang serupa. Apakah C punya? Bisakah Anda memposting beberapa kode contoh?
110
Hampir semua bahasa memiliki foreach
lingkaran atau sesuatu yang serupa. Apakah C punya? Bisakah Anda memposting beberapa kode contoh?
foreach
" dari apa?foreach
loop dalam program C?Jawaban:
C tidak memiliki foreach, tetapi makro sering digunakan untuk meniru bahwa:
Dan bisa digunakan seperti
Iterasi melalui larik juga dimungkinkan:
Dan bisa digunakan seperti
Edit: Jika Anda juga tertarik dengan solusi C ++, C ++ memiliki native untuk setiap sintaks yang disebut "berbasis rentang"
sumber
#define foreach(item, array) int count=0, size=sizeof(array)/sizeof(*(array)); for(item = (array); count != size; count++, item = (array)+count)
Satu masalah yang dapat saya lihat adalah bahwa jumlah dan ukuran variabel berada di luar loop for, dan mungkin menyebabkan konflik. Apakah ini alasan Anda menggunakan dua untuk loop? [kode ditempel di sini ( pastebin.com/immndpwS )]if(...) foreach(int *v, values) ...
. Jika mereka berada di luar loop maka akan mengembangif(...) int count = 0 ...; for(...) ...;
dan akan putus.Berikut adalah contoh program lengkap untuk setiap makro di C99:
sumber
list[]
definisi? Tidak bisakah Anda menulisnext
saja.next
?free()
) dan untuk hal lain ia memiliki referensi ke nilai di dalam definisinya. Ini benar-benar contoh dari sesuatu yang terlalu pintar; kode cukup kompleks tanpa sengaja menambahkan kepintaran padanya. Pepatah Kernighan ( stackoverflow.com/questions/1103299/… ) berlaku!Tidak ada foreach dalam C.
Anda dapat menggunakan perulangan for untuk mengulang melalui data tetapi panjangnya perlu diketahui atau data harus diakhiri dengan nilai yang diketahui (mis. Null).
sumber
Seperti yang mungkin sudah Anda ketahui, tidak ada loop bergaya "foreach" di C.
Meskipun sudah ada banyak sekali makro hebat yang disediakan di sini untuk mengatasi hal ini, mungkin makro ini berguna bagi Anda:
... yang dapat digunakan dengan
for
(seperti dalamfor each (...)
).Keuntungan dari pendekatan ini:
item
dideklarasikan dan bertambah dalam pernyataan for (seperti di Python!).p
,item
), tidak terlihat di luar lingkup loop (karena mereka dideklarasikan di header loop for).Kekurangan:
typeof()
, yang merupakan ekstensi GNU, bukan bagian dari C standarHanya untuk menghemat waktu, berikut cara mengujinya:
Sepertinya bekerja pada gcc dan clang secara default; belum menguji kompiler lain.
sumber
Ini adalah pertanyaan yang cukup lama, tetapi saya pikir saya harus memposting ini. Ini adalah foreach loop untuk GNU C99.
Kode ini telah diuji untuk bekerja dengan gcc, icc dan clang di GNU / Linux.
sumber
Meskipun C tidak memiliki a untuk setiap konstruk, C selalu memiliki representasi idiomatik untuk salah satu dari akhir array
(&arr)[1]
. Ini memungkinkan Anda untuk menulis idiomatik sederhana untuk setiap loop sebagai berikut:sumber
(&arr)[1]
tidak berarti satu item larik melewati akhir larik, itu berarti satu larik melewati akhir larik.(&arr)[1]
bukan item terakhir dari larik [0], ini adalah larik [1], yang meluruh menjadi penunjuk ke elemen pertama (dari larik [1]). Saya percaya akan jauh lebih baik, lebih aman dan idiomatis untuk dilakukanconst int* begin = arr; const int* end = arr + sizeof(arr)/sizeof(*arr);
dan kemudianfor(const int* a = begin; a != end; a++)
.C memiliki kata kunci 'untuk' dan 'sementara'. Jika pernyataan foreach dalam bahasa seperti C # terlihat seperti ini ...
... maka padanan dari pernyataan foreach di C ini mungkin seperti:
sumber
Inilah yang saya gunakan ketika saya terjebak dengan C. Anda tidak dapat menggunakan nama item yang sama dua kali dalam lingkup yang sama, tetapi itu sebenarnya bukan masalah karena tidak semua dari kita dapat menggunakan kompiler baru yang bagus :(
Pemakaian:
EDIT: Berikut adalah alternatif untuk
FOREACH
menggunakan sintaks c99 untuk menghindari polusi namespace:sumber
VAR(i) < (size) && (item = array[VAR(i)])
akan berhenti setelah elemen array memiliki nilai 0. Jadi menggunakan ini dengandouble Array[]
tidak dapat melakukan iterasi melalui semua elemen. Sepertinya tes loop harus salah satu atau yang lain:i<n
atauA[i]
. Mungkin menambahkan contoh kasus penggunaan untuk kejelasan.if ( bla ) FOREACH(....) { } else....
FOREACH
yang menggunakan sintaks c99 untuk menghindari polusi namespace.Jawaban Eric tidak berfungsi saat Anda menggunakan "istirahat" atau "lanjutkan".
Ini bisa diperbaiki dengan menulis ulang baris pertama:
Baris asli (diformat ulang):
Tetap:
Jika Anda membandingkannya dengan putaran Johannes, Anda akan melihat bahwa dia sebenarnya melakukan hal yang sama, hanya sedikit lebih rumit dan lebih buruk.
sumber
Ini yang sederhana, single for loop:
Memberi Anda akses ke indeks jika Anda menginginkannya (
i
) dan item saat ini yang sedang kita iterasi (it
). Perhatikan bahwa Anda mungkin memiliki masalah penamaan saat membuat loop bersarang, Anda dapat membuat item dan nama indeks menjadi parameter untuk makro.Sunting: Berikut adalah versi modifikasi dari jawaban yang diterima
foreach
. Memungkinkan Anda menentukanstart
indeks,size
sehingga ia bekerja pada array yang membusuk (pointer), tidak perluint*
dan diubahcount != size
menjadi untuki < size
berjaga-jaga jika pengguna secara tidak sengaja mengubah 'i' menjadi lebih besar darisize
dan terjebak dalam loop tak terbatas.Keluaran:
sumber
Jika Anda berencana untuk bekerja dengan pointer fungsi
Pemakaian:
Tapi saya pikir ini hanya akan berfungsi di gcc (tidak yakin).
sumber
C tidak memiliki implementasi
for-each
. Saat mem-parsing array sebagai titik, penerima tidak mengetahui berapa panjang array tersebut, sehingga tidak ada cara untuk mengetahui kapan Anda mencapai akhir array. Ingat, di Cint*
adalah titik ke alamat memori yang mengandung int. Tidak ada objek header yang berisi informasi tentang berapa banyak bilangan bulat yang ditempatkan secara berurutan. Jadi, programmer perlu melacak ini.Namun, untuk list, mudah untuk mengimplementasikan sesuatu yang menyerupai
for-each
loop.Untuk mencapai sesuatu yang serupa untuk array, Anda dapat melakukan salah satu dari dua hal.
Berikut ini adalah contoh dari struct tersebut:
sumber