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 = E2
tươ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 E1
có kiểu nguyên tử, phép gán ghép là thao tác đọc-sửa-ghi với memory_order_seq_cst
ngữ 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à c
và 1
do đó đượ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 char
và đượ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_MIN
là 0 và do đó char
không dấu.
Hoặc char
sau đó được thăng cấp lên int
hoặc unsigned int
nếu nó được thăng cấp thành một int
, thì CHAR_MAX + 1
nhất thiết sẽ phù hợp với một int
quá, và sẽ không tràn, hoặc nếu unsigned int
nó có thể phù hợp hoặc bao quanh bằng không. Khi giá trị kết quả, bằng số CHAR_MAX + 1
hoặc 0
sau 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 + 1
sẽ phù hợp với int
và 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 int
và CHAR_MAX == INT_MAX
=> CHAR_MAX + 1
sẽ 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 char
là 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 char
là 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à ++c
có 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ị c
trước khi tăng; đối với ba phần còn lại, nó sẽ là giá trị c
sau khi tăng.