Câu hỏi có hai mặt: Thứ nhất, là
char c = CHAR_MAX;
c += 1;
đánh giá khác với
char c = CHAR_MAX;
c = c + 1;
và câu trả lời là không , vì C11 / C18 6.5.16.2p3 :
- Một phép gán hỗn hợp của biểu mẫu
E1 op = E2tương đương với biểu thức gán đơn giản E1 = E1 op (E2)ngoại trừ giá trị chỉ E1được đánh giá một lần và đối với lệnh gọi hàm không xác định theo trình tự, hoạt động của phép gán ghép là một đánh giá duy nhất. Nếu E1có kiểu nguyên tử, phép gán ghép là thao tác đọc-sửa-ghi với memory_order_seq_cstngữ nghĩa thứ tự bộ nhớ. 113)
Sau đó, câu hỏi là những gì xảy ra trong c = c + 1. Ở đây, toán hạng để +trải qua chuyển đổi số học thông thường, và cvà 1do đó được thăng chức int, trừ khi một kiến trúc thực sự lập dị yêu cầu charđược thăng chức unsigned int. Việc tính toán +sau đó được ước tính và kết quả của loại int/ unsigned intđược chuyển đổi trở lại charvà được lưu trữ trong c.
Có 3 cách xác định theo cách thực hiện, theo đó cách này có thể được đánh giá:
CHAR_MINlà 0 và do đó charkhông dấu.
Hoặc charsau đó được thăng cấp lên inthoặc unsigned intnếu nó được thăng cấp thành một int, thì CHAR_MAX + 1nhất thiết sẽ phù hợp với một intquá, và sẽ không tràn, hoặc nếu unsigned intnó có thể phù hợp hoặc bao quanh bằng không. Khi giá trị kết quả, bằng số CHAR_MAX + 1hoặc 0sau khi giảm modulo, trở lại c, sau khi giảm modulo, nó sẽ trở thành 0, nghĩa làCHAR_MIN
Mặt khác charđược ký, nếu CHAR_MAX nhỏ hơn INT_MAX, kết quả CHAR_MAX + 1sẽ phù hợp với intvà C11 / C18 6.3.1.3p3 tiêu chuẩn áp dụng cho chuyển đổi xảy ra khi gán :
- Mặt khác, loại mới được ký và giá trị không thể được biểu diễn trong đó; hoặc kết quả là xác định thực hiện hoặc tín hiệu xác định thực hiện được đưa ra.
Hoặc, iff sizeof (int) == 1 và char được ký, sau đó charđược thăng cấp thành intvà CHAR_MAX == INT_MAX=> CHAR_MAX + 1sẽ gây ra tràn số nguyên và hành vi sẽ không được xác định .
Tức là kết quả có thể là:
Nếu charlà một kiểu số nguyên không dấu, kết quả luôn luôn là 0, tức là CHAR_MIN.
Mặt khác charlà một kiểu số nguyên đã ký và hành vi được xác định thực hiện / không xác định:
CHAR_MIN hoặc một số giá trị được xác định thực hiện khác,
- một tín hiệu xác định thực hiện được đưa ra, có thể chấm dứt chương trình,
- hoặc hành vi không được xác định trên một số nền tảng trong đó
sizeof (char) == sizeof (int).
Tất cả các hoạt động tăng c = c + 1, c += 1, c++và ++ccó tác dụng phụ như nhau trên cùng một nền tảng. Giá trị được đánh giá của biểu thức c++sẽ là giá trị ctrước khi tăng; đối với ba phần còn lại, nó sẽ là giá trị csau khi tăng.