2012-02-22 32 views
5

Tôi đã làm việc trên Khái niệm cơ bản của C và đã cố gắng giải quyết vấn đề bên dưới có thể giải thích tại sao đầu ra của biến số c khác không?Tại sao c không được tăng lên trong đầu ra?

Đầu ra của chương trình sau là gì?

int main() 
{ 
    int a = -3, b = 2, c= 0, d; 
    d = ++a && ++b || ++c; 
    printf ("a = %d, b = %d, c = %d, d = %d", a, b, c, d); 
} 

Ans: -2, 3, 0, 1

Tại sao c không tăng lên trong đầu ra?

+1

d = ((-2 && 3) || (++ c)). Nó ngắn mạch trước khi nó được c. –

+0

Bạn đang thực sự cố gắng làm gì? Hay bạn chỉ đơn giản là chơi với một số mã? – Bart

+0

chỉ đơn giản là giải quyết các câu đố c – Nisha

Trả lời

10

Biến số c không tăng lên vì RHS (bên tay phải) của || không được thực hiện trừ khi LHS đánh giá sai và LHS đánh giá là đúng. Các toán tử C ||&& là các toán tử 'ngắn mạch'; họ không đánh giá toán hạng thứ hai trừ khi toán tử thứ nhất không đủ để xác định sự thật tổng thể của biểu thức.

Các && liên kết chặt chẽ hơn so với ||, do đó hoạt động có thể được ngoặc như:

d = (++a && ++b) || ++c; 

Giá trị của ++a là -2, mà trả về true (vì bất kỳ giá trị mà không phải là 0 đánh giá để đúng); giá trị của ++b là 3, được đánh giá là đúng; do đó, giá trị của cụm từ && là đúng. Bởi vì true || falsetrue || true cả hai đánh giá là true, không cần đánh giá RHS để biết kết quả tổng thể. (Quy tắc tương tự cho && là nếu cụm từ đầu tiên đánh giá sai, không cần đánh giá thứ hai vì biểu thức tổng thể phải sai. Nếu bạn có a = -1; trước khi thử nghiệm, thì b sẽ không được tăng lên, vì ++a sẽ Tất nhiên, sau đó c sẽ được tăng lên vì LHS của || sẽ là sai, và RHS sẽ phải được đánh giá để xác định kết quả tổng thể.)

+2

Có lẽ anh ta không hiểu cách -2 và 3 đánh giá đúng. –

+0

@ 0A0D: Tôi đã nhận xét về điều đó - bạn có thể chính xác. –

9

++a && ++b đánh giá là true.

Nó được gọi là đoản mạch. Biểu thức bên trong điều kiện được đánh giá từ trái sang phải. Nếu trường hợp của bạn, nếu điều kiện đầu tiên trong mệnh đề OR được đánh giá là true, không có điểm nào cho điều kiện thứ hai cũng được đánh giá, vì toàn bộ biểu thức được biết là true rồi.

2

Trong C, các toán tử logic boolean &&||short-circuiting. Điều này có nghĩa là họ chỉ đánh giá bên phải của họ, nếu đánh giá phía bên trái là không đủ để biết câu trả lời.

Đối với mã của bạn, điều này có tác dụng không bao giờ đánh giá ++c, vì phía bên tay trái không bằng 0 và do đó kết quả của boolean sẽ là đúng và không cần phải thực hiện thêm.

2

Đó là đánh giá biểu thức boolean lười biếng. Việc thực hiện là:

++a cho -2

++b cho 3

-2 && 3 cho 1

Được rồi! Không cần kiểm tra kết quả của ||. Vì vậy, ++c không được đánh giá.

Quy tắc là: phần biểu thức X không được đánh giá trong các trường hợp: (0 && X), (1 || X). Ở đây, 1 là "không 0" tất nhiên.

2
 
d= ++a && ++b || ++c 
d= ++(-2) && ++b || ++c 
d= -1 && ++b || ++c 
d= true && ++b || ++c 
d= true && ++2 || ++c 
d= true && true || ++c 
d= true || ++c 
d= 1 

Đó là khoảng cách hoạt động đằng sau những cảnh ...

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