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 = E2
setara dengan ekspresi penugasan sederhana E1 = E1 op (E2)
kecuali bahwa nilai E1
dievaluasi hanya sekali, dan sehubungan dengan pemanggilan fungsi yang tidak ditentukan urutannya, operasi penugasan majemuk adalah evaluasi tunggal. Jika E1
memiliki tipe atom, penugasan majemuk adalah operasi baca-modifikasi-tulis dengan memory_order_seq_cst
semantik urutan memori. 113)
Lalu, pertanyaannya adalah apa yang terjadi di c = c + 1
. Di sini operan untuk +
menjalani konversi aritmatika biasa, dan c
dan 1
karenanya dipromosikan int
, kecuali jika arsitektur yang benar-benar aneh mengharuskan yang char
dipromosikan unsigned int
. Perhitungan +
kemudian dievaluasi, dan hasilnya, jenis int
/ unsigned int
dikonversi kembali ke char
dan disimpan dalam c
.
Ada 3 cara yang ditentukan implementasi yang kemudian dapat dievaluasi:
CHAR_MIN
adalah 0 dan karenanya char
tidak ditandatangani.
Entah char
kemudian dipromosikan ke int
atau unsigned int
dan jika dipromosikan ke int
, maka CHAR_MAX + 1
tentu akan cocok menjadi int
terlalu, dan tidak akan meluap, atau jika unsigned int
mungkin cocok atau membungkus ke nol. Ketika nilai yang dihasilkan, yang secara numerik baik CHAR_MAX + 1
atau 0
setelah pengurangan modulo, kembali ke c
, setelah pengurangan modulo itu akan menjadi 0, yaituCHAR_MIN
Jika char
tidak ditandatangani, maka jika CHAR_MAX
lebih kecil dari INT_MAX
, hasil CHAR_MAX + 1
akan 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 char
dipromosikan ke int
, dan CHAR_MAX == INT_MAX
=> CHAR_MAX + 1
akan menyebabkan bilangan bulat bilangan bulat dan perilaku akan tidak terdefinisi .
Yaitu hasil yang mungkin adalah:
Jika char
adalah tipe integer yang tidak ditandatangani, hasilnya selalu 0
, yaitu CHAR_MIN
.
Jika tidak, char
merupakan 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 ++c
memiliki efek samping yang sama pada platform yang sama. Nilai ekspresi yang dievaluasi c++
akan menjadi nilai c
sebelum kenaikan; untuk tiga lainnya, itu akan menjadi nilai c
setelah kenaikan.