Tôi tin rằng bạn đã có câu trả lời của bạn, nhưng chỉ để xây dựng một chút từng bước, hãy để tôi thêm một giải thích rõ hơn tại đây. Thứ nhất, để trích dẫn các thuộc tính của &&
và ||
nhà khai thác, từ C11
tiêu chuẩn, chương §6.5.13 và §6.5.13, tương ứng,
(I)
Nhà điều hành &&
sẽ mang lại 1 nếu cả hai toán hạng của nó so sánh không bằng với 0; nếu không, nó sản lượng 0. [...] Nếu toán hạng đầu tiên so sánh bằng 0, toán hạng thứ hai không được đánh giá.
và
(II)
Nhà điều hành ||
sẽ mang lại 1 nếu một trong hai toán hạng của nó so sánh không công bằng 0; nếu không, nó sản lượng 0. [...]. Nếu toán hạng đầu tiên so sánh bất bình đẳng với 0, toán hạng thứ hai là không được đánh giá.
và cả hai đều đảm bảo đánh giá từ trái sang phải.Vì vậy, so sánh mã của bạn,
d = ++a && ++b || ++c;
nó sẽ xảy ra như
d = ((++a && ++b) || ++c);
mà đánh giá để
d = ((6 && ++b) || ++c);
và sau đó
d = ((6 && (-6)) || ++c);
Bây giờ trong giai đoạn trên, (I) được hoàn thành và nó xuống đến
d = (1 || ++c);
Bây giờ, sau khi nhấn mạnh, trong đó đã đáp ứng được (II), vì vậy không đánh giá thêm các toán hạng RHS của ||
được thực hiện (ví dụ: ++c
không đánh giá), và nó dường như là d = 1
và kết quả cuối cùng, 1, được lưu trữ vào d
.
Đó là cách, a == 6
, b == -6
, c == 0
và d ==1
.
Có nói rằng, void main()
nên được thay đổi để int main(void)
, ít nhất là để phù hợp với tiêu chuẩn.
Câu trả lời của bạn đã được chấp nhận. Đó là về nhiều bằng chứng như bạn sẽ cần. Đôi khi tôi tự hỏi nếu tôi không làm quá sức, khi tôi viết một câu trả lời như thế, và vào thời điểm tôi làm xong, ai đó đã viết một câu trả lời 'Thử cái này' ''mà được chấp nhận thay thế. –
GolezTrol
@GolezTrol Tôi nghĩ rằng bạn có nghĩa là để gửi bình luận này theo câu trả lời của tôi, tuy nhiên, cảm ơn bạn. :) –
@SouravGhosh Ah, đó là nơi nhận xét đó đã đi! Tôi có nghĩa là để đăng nó dưới [câu hỏi của bạn trên Meta] (http://meta.stackoverflow.com/questions/313420/how-much-explanation-is-good-am-i-overdoing-it), nhưng sau đó tôi không thể không tìm thấy nó nữa. :) – GolezTrol