Pertanyaannya ada dua: Pertama
char c = CHAR_MAX;
c += 1;
dievaluasi berbeda dari
char c = CHAR_MAX;
c = c + 1;
dan jawabannya adalah tidak , karena C11 / C18 6.5.16.2p3 :
- Penugasan majemuk dari formulir
E1 op = E2setara dengan ekspresi penugasan sederhana E1 = E1 op (E2)kecuali bahwa nilai E1dievaluasi hanya sekali, dan sehubungan dengan pemanggilan fungsi yang tidak ditentukan urutannya, operasi penugasan majemuk adalah evaluasi tunggal. Jika E1memiliki tipe atom, penugasan majemuk adalah operasi baca-modifikasi-tulis dengan memory_order_seq_cstsemantik urutan memori. 113)
Lalu, pertanyaannya adalah apa yang terjadi di c = c + 1. Di sini operan untuk +menjalani konversi aritmatika biasa, dan cdan 1karenanya dipromosikan int, kecuali jika arsitektur yang benar-benar aneh mengharuskan yang chardipromosikan unsigned int. Perhitungan +kemudian dievaluasi, dan hasilnya, jenis int/ unsigned intdikonversi kembali ke chardan disimpan dalam c.
Ada 3 cara yang ditentukan implementasi yang kemudian dapat dievaluasi:
CHAR_MINadalah 0 dan karenanya chartidak ditandatangani.
Entah charkemudian dipromosikan ke intatau unsigned intdan jika dipromosikan ke int, maka CHAR_MAX + 1tentu akan cocok menjadi intterlalu, dan tidak akan meluap, atau jika unsigned intmungkin cocok atau membungkus ke nol. Ketika nilai yang dihasilkan, yang secara numerik baik CHAR_MAX + 1atau 0setelah pengurangan modulo, kembali ke c, setelah pengurangan modulo itu akan menjadi 0, yaituCHAR_MIN
Jika chartidak ditandatangani, maka jika CHAR_MAX lebih kecil dari INT_MAX, hasil CHAR_MAX + 1akan cocok int, dan standar C11 / C18 6.3.1.3p3 berlaku untuk konversi yang terjadi pada penugasan :
- Jika tidak, tipe baru ditandatangani dan nilainya tidak dapat diwakili di dalamnya; baik hasilnya adalah implementasi yang ditentukan atau sinyal implementasi yang ditetapkan dinaikkan.
Atau, jikaf sizeof (int) == 1 dan char ditandatangani, maka chardipromosikan ke int, dan CHAR_MAX == INT_MAX=> CHAR_MAX + 1akan menyebabkan bilangan bulat bilangan bulat dan perilaku akan tidak terdefinisi .
Yaitu hasil yang mungkin adalah:
Jika charadalah tipe integer yang tidak ditandatangani, hasilnya selalu 0, yaitu CHAR_MIN.
Jika tidak, charmerupakan tipe integer yang ditandatangani, dan perilaku didefinisikan-didefinisikan / tidak didefinisikan:
CHAR_MIN atau beberapa nilai yang ditentukan implementasi lainnya,
- sinyal yang ditentukan implementasi dinaikkan, mungkin mengakhiri program,
- atau perilaku tidak terdefinisi pada beberapa platform di mana
sizeof (char) == sizeof (int).
Semua operasi increment c = c + 1, c += 1, c++dan ++cmemiliki efek samping yang sama pada platform yang sama. Nilai ekspresi yang dievaluasi c++akan menjadi nilai csebelum kenaikan; untuk tiga lainnya, itu akan menjadi nilai csetelah kenaikan.