2013-05-10 33 views
5
int a = 1, b = 0; 

if(a, b) 
    printf("success\n"); 
else 
    printf("fail\n"); 

if(b, a) 
    printf("success\n"); 
else 
    printf("fail"); 

Đây là một tập tin cpp và tôi đã nhận sản lượng trong Visual Studio 2010 nhưdấu phẩy nhà điều hành trong điều kiện nếu

fail 
success 

Tại sao hành vi này? Bạn có thể giải thích?

+6

Bạn biết rằng nó được sử dụng toán tử dấu phẩy trong tình trạng này, tuy nhiên bạn phải tự hỏi? –

+0

Bạn chỉ có thể thêm một điểm ngắt trên câu lệnh đầu tiên và thực hiện dòng chương trình theo dòng bằng cách sử dụng F10 để tự xem luồng. – vish213

+0

@DanielFischer Tôi biết rằng dấu phẩy đóng vai trò như một điểm chuỗi trong các câu lệnh nhưng không phải trong các đối số với các hàm. Bạn có thể cho tôi biết đó có phải là một điểm chuỗi bên trong 'if' không? Tôi cảm thấy trực giác ** có **, nhưng tôi muốn bạn xác nhận. –

Trả lời

35

http://en.wikipedia.org/wiki/Comma_operator:

Trong C và C++ ngôn ngữ lập trình, toán tử phẩy (đại diện bởi các dấu hiệu ,) là một nhà điều hành nhị phân mà đánh giá toán hạng đầu tiên của mình và loại bỏ kết quả, và sau đó đánh giá toán hạng hai và trả về giá trị này (và gõ).

Trong if đầu tiên của bạn:

if (a, b) 

a được đánh giá đầu tiên và bỏ đi, b được đánh giá thứ hai và trở về như 0. Vì vậy, tình trạng này là sai.

Trong giây if của bạn:

if (b, a) 

b được đánh giá đầu tiên và bỏ đi, a được đánh giá thứ hai và trở về như 1. Vì vậy, tình trạng này là đúng.

Nếu có nhiều hơn hai toán hạng, biểu thức cuối cùng sẽ được trả về.

Nếu bạn muốn cả hai điều kiện là đúng, bạn nên sử dụng && operator:

if (a && b) 
+0

Vậy điều kiện làm điều kiện như thế là gì? ai đó có thể cung cấp một ví dụ tốt hơn và hữu ích – Pars

+1

@Pars Nó rất hữu ích nếu bạn muốn thực hiện một hoạt động gây ra tác dụng phụ, nhưng không cần giá trị trả lại thực tế. Ví dụ, tôi đã có điều kiện này trong một trong các dự án của tôi: 'if (number_read (str, & err),! Err)'. Tôi đã sử dụng '&&! Err' thay vì',! Err', tôi sẽ không thể đọc được số 0. –