Soru iki yönlüdür: Birincisi,
char c = CHAR_MAX;
c += 1;
farklı değerlendirildi
char c = CHAR_MAX;
c = c + 1;
ve cevap hayır değil , çünkü C11 / C18 6.5.16.2p3 :
- Formun bir bileşik ataması
E1 op = E2
, basit değerin ifade edilmesine eşdeğerdir E1 = E1 op (E2)
, ancak lvalue E1
sadece bir kez değerlendirilir ve belirsiz bir şekilde dizilenmiş bir fonksiyon çağrısına göre, bir bileşik atamasının çalışması tek bir değerlendirmedir. Eğer E1
bir atom türü vardır, bileşik atama ile salt değiştirme-yazma operasyonu memory_order_seq_cst
bellek sipariş anlam. 113)
O zaman soru ne oluyor c = c + 1
. Burada işlenenler +
olağan aritmetik dönüşümlere uğrayacak c
ve 1
bu nedenle int
, gerçekten tuhaf bir mimari gerektirmediği sürece char
terfi edilmektedir unsigned int
. Daha +
sonra hesaplanması değerlendirilir ve int
/ türünün sonucu unsigned int
geri dönüştürülür char
ve içinde saklanır c
.
Orada 3 bu daha sonra değerlendirilebilir hangi uygulama tanımlı yolları:
CHAR_MIN
0 char
olduğundan imzasızdır.
Ya char
sonra terfi edilir int
veya unsigned int
ve bir terfi durumunda int
, o zaman CHAR_MAX + 1
mutlaka bir sığacak int
kadar değil, taşma veya eğer unsigned int
sığdırmak veya sıfıra etrafına sarmak olabilir. Sayısal olarak ya modulo indirgeme işleminden sonra ya CHAR_MAX + 1
da 0
sonra ortaya çıkan değer, modulo indirgeme c
işleminden sonra 0 olur, yaniCHAR_MIN
Aksi char
imzalanmış ise, o zaman CHAR_MAX
daha küçük INT_MAX
, sonucu CHAR_MAX + 1
bir uyacak int
ve standart C11 / C18 6.3.1.3p3 üzerine olur dönüşüm için geçerlidir atama :
- Aksi takdirde, yeni tür imzalanır ve değer, içinde temsil edilemez; sonuç uygulama tarafından tanımlanır veya uygulama tarafından tanımlanan bir sinyal oluşturulur.
Veya iff sizeof (int) == 1
ve char
imzalı, daha sonra a char
olarak yükseltilir int
ve CHAR_MAX == INT_MAX
=> CHAR_MAX + 1
tamsayı taşmasına neden olur ve davranış tanımsız olur .
Yani olası sonuçlar:
Eğer char
bir işaretsiz tamsayı türüdür, sonuç her zaman 0
yani CHAR_MIN
.
Aksi takdirde char
, işaretli bir tamsayı türüdür ve davranış, uygulama tanımlı / tanımsızdır:
CHAR_MIN
veya başka bir uygulama tanımlı değer,
- uygulama tarafından tanımlanan bir sinyal ortaya çıkar ve muhtemelen programı sonlandırır,
- veya bazı platformlarda davranış tanımsızdır
sizeof (char) == sizeof (int)
.
Tüm artış işlemleri c = c + 1
, c += 1
, c++
ve ++c
aynı platform üzerinde aynı yan etkileri vardır. İfadenin değerlendirilen değeri, artıştan c++
önceki değer olacaktır c
; diğer üçü için bu c
artıştan sonraki değer olacaktır .