2015-12-25 15 views
6

Tôi có một vấn đề với một câu hỏi trong cuốn sách của tôi:bài tập lập trình cơ bản về toán tử logic

#include<stdio.h> 
void main() 
{ 
    int a=5, b=-7, c=0, d; 
    d = ++a && ++b || ++c; 
    printf("\n%d%d%d%d",a,b,c,d); 
} 

Câu hỏi đặt ra hỏi tôi đầu ra của mã là gì. Tôi chạy nó và kết quả trên màn hình là 6-601. Tôi hiểu lý do tại sao a=6b=-6, nhưng tôi không hiểu tại sao c=0d=1?

+0

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

+0

@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. :) –

+0

@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

Trả lời

15

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 &&|| 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á.

(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 == 0d ==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.

+0

Cảm ơn bạn, lời giải thích của bạn là rất rõ ràng, nhưng tôi đang nhầm lẫn giữa void chính() và int chính (void), mã ở trên tôi chỉ cần sao chép trực tiếp từ cuốn sách của tôi. –

+0

@ Hoang.T có một cuộc thảo luận rất hay được đăng tại đây [http://stackoverflow.com/q/204476/2173917). Hãy đọc nó. :) –

14

Toán tử HOẶC || HOẶC ngắn mạch, có nghĩa là nếu bên trái là đúng thì bên phải không được đánh giá. Trong trường hợp này ++a && ++b đánh giá là đúng, vì vậy ++c không bao giờ chạy và c giữ giá trị bằng 0.

Cũng vì nó được đánh giá là đúng, điều này được ký hiệu là 1 được lưu trữ trong d.

Mọi giá trị khác 0 được coi là đúng và kết quả của phép toán boolean được xác định là 0 hoặc 1 làm số nguyên.

Các vấn đề liên quan