Apa yang dilakukan ,
operator di C?
c
operators
comma-operator
lillq
sumber
sumber
Jawaban:
Ekspresi:
Ekspresi1 pertama dievaluasi, kemudian ekspresi2 dievaluasi, dan nilai ekspresi2 dikembalikan untuk seluruh ekspresi.
sumber
i
memiliki nilai 5, 4, 3, 2 atau 1. Ini hanya 0. Praktis tidak berguna kecuali ekspresi memiliki efek samping.i = b, c;
setara dengan(i = b), c
karena karena penugasan=
memiliki prioritas lebih tinggi daripada operator koma,
. Operator koma memiliki prioritas terendah dari semua.expression1, expression2;
pertamaexpression1
dievaluasi, mungkin karena efek sampingnya (seperti memanggil fungsi), kemudian ada titik urutan, kemudianexpression2
dievaluasi dan nilai dikembalikan ...Saya telah melihat yang paling sering digunakan dalam
while
loop:Ini akan melakukan operasi, kemudian melakukan tes berdasarkan efek samping. Cara lain adalah dengan melakukannya seperti ini:
sumber
while (read_string(s) && s.len() > 5)
. Jelas itu tidak akan berhasil jikaread_string
tidak memiliki nilai kembali (atau tidak memiliki nilai yang berarti). (Sunting: Maaf, tidak menyadari berapa usia kiriman ini.)while (1)
denganbreak;
pernyataan di dalam tubuh. Mencoba memaksa bagian break-out dari kode menjadi test sementara atau turun ke tes do-while, seringkali merupakan pemborosan energi dan membuat kode lebih sulit untuk dipahami.while(1)
danbreak
;The operator koma akan mengevaluasi operan kiri, membuang hasilnya dan kemudian mengevaluasi operan kanan dan yang akan menjadi hasilnya. Penggunaan idiomatis seperti tercantum dalam tautan adalah saat menginisialisasi variabel yang digunakan dalam satu
for
lingkaran, dan memberikan contoh berikut:Kalau tidak, tidak ada banyak kegunaan besar dari operator koma , meskipun mudah untuk menyalahgunakan untuk menghasilkan kode yang sulit dibaca dan dipelihara.
Dari standar draft C99 tata bahasanya adalah sebagai berikut:
dan ayat 2 mengatakan:
Catatan kaki 97 mengatakan:
yang berarti Anda tidak dapat menetapkan hasil dari operator koma .
Penting untuk dicatat bahwa operator koma memiliki prioritas paling rendah dan oleh karena itu ada kasus di mana penggunaan
()
dapat membuat perbedaan besar, misalnya:akan memiliki output berikut:
sumber
Operator koma menggabungkan dua ekspresi kedua sisi menjadi satu, mengevaluasi keduanya dalam urutan kiri-ke-kanan. Nilai sisi kanan dikembalikan sebagai nilai keseluruhan ekspresi.
(expr1, expr2)
seperti{ expr1; expr2; }
tetapi Anda dapat menggunakan hasilexpr2
dalam panggilan fungsi atau tugas.Sering terlihat dalam
for
loop untuk menginisialisasi atau mempertahankan beberapa variabel seperti ini:Terlepas dari ini, saya hanya menggunakannya "dalam kemarahan" dalam satu kasus lain, ketika menyelesaikan dua operasi yang harus selalu berjalan bersama dalam makro. Kami memiliki kode yang menyalin berbagai nilai biner ke buffer byte untuk dikirim di jaringan, dan sebuah pointer mempertahankan di mana kami telah sampai:
Di mana nilainya
short
atauint
kami melakukan ini:Kemudian kita membaca bahwa ini bukan C yang benar-benar valid, karena
(short *)ptr
tidak lagi bernilai l dan tidak dapat ditingkatkan, meskipun kompiler kami pada saat itu tidak keberatan. Untuk memperbaiki ini, kami membagi ekspresi menjadi dua:Namun, pendekatan ini bergantung pada semua pengembang yang mengingat untuk menempatkan kedua pernyataan di sepanjang waktu. Kami menginginkan fungsi di mana Anda bisa meneruskan di pointer output, nilai dan dan tipe nilai. Ini adalah C, bukan C ++ dengan templat, kami tidak dapat memiliki fungsi mengambil tipe arbitrer, jadi kami memutuskan makro:
Dengan menggunakan operator koma, kami dapat menggunakan ini dalam ekspresi atau sebagai pernyataan seperti yang kami inginkan:
Saya tidak menyarankan contoh-contoh ini adalah gaya yang baik! Memang, saya sepertinya ingat Steve McConnell's Code Complete menasihati bahkan menggunakan operator koma dalam satu
for
loop: untuk keterbacaan dan pemeliharaan, loop harus dikontrol oleh hanya satu variabel, dan ekspresi dalamfor
baris itu sendiri hanya boleh berisi kode loop-control, bukan bit tambahan lain dari inisialisasi atau pemeliharaan loop.sumber
Ini menyebabkan evaluasi beberapa pernyataan, tetapi hanya menggunakan yang terakhir sebagai nilai yang dihasilkan (nilai, saya pikir).
Begitu...
harus menghasilkan x yang diatur ke 8.
sumber
Seperti jawaban sebelumnya telah menyatakan itu mengevaluasi semua pernyataan tetapi menggunakan yang terakhir sebagai nilai ekspresi. Secara pribadi saya hanya menemukan itu berguna dalam ekspresi lingkaran:
sumber
Satu-satunya tempat yang saya lihat bermanfaat adalah ketika Anda menulis loop funky di mana Anda ingin melakukan banyak hal dalam salah satu ekspresi (mungkin ekspresi init atau ekspresi loop. Sesuatu seperti:
Maafkan saya jika ada kesalahan sintaks atau jika saya mencampurkan sesuatu yang tidak ketat C. Saya tidak berargumen bahwa, operator adalah bentuk yang baik, tetapi untuk itulah Anda dapat menggunakannya. Dalam kasus di atas saya mungkin akan menggunakan
while
loop sebagai gantinya sehingga beberapa ekspresi pada init dan loop akan lebih jelas. (Dan saya akan menginisialisasi i1 dan i2 inline alih-alih mendeklarasikan dan kemudian menginisialisasi .... bla bla bla.)sumber
Saya menghidupkan kembali ini hanya untuk menjawab pertanyaan dari @Rajesh dan @JeffMercado yang saya pikir sangat penting karena ini adalah salah satu hit mesin pencari teratas.
Ambil cuplikan kode berikut sebagai contoh
Itu akan mencetak
The
i
kasus ditangani seperti yang dijelaskan oleh sebagian besar jawaban. Semua ekspresi dievaluasi dalam urutan kiri-ke-kanan tetapi hanya yang terakhir ditugaskani
. Hasil dari(
ekspresi )is
1`.Kasing
j
ini mengikuti aturan prioritas yang berbeda karena,
memiliki prioritas operator terendah. Karena aturan-aturan, kompilator melihat tugas-ekspresi, konstanta, konstan ... . Ekspresi yang lagi dievaluasi dalam kiri-ke-kanan ketertiban dan efek samping mereka tetap terlihat, oleh karena itu,j
adalah5
sebagai akibat darij = 5
.Interstingly,
int j = 5,4,3,2,1;
tidak diizinkan oleh spec bahasa. Sebuah initializer mengharapkan tugas-ekspresi sehingga langsung,
operator tidak diperbolehkan.Semoga ini membantu.
sumber