2011-07-28 33 views
7

Tôi đang tìm kiếm tại một số mã di sản C và đã nhầm lẫn, nó là một cái gì đó như:Đặt kiểm tra tình trạng và phân công biến trong một câu lệnh if

UINT A, B = 1; 
if((A = B) == 1){ 
    return(TRUE); 
} else { 
    return(FALSE); 
} 

Chúng ta đều biết sẽ có một cảnh báo trình biên dịch nếu chúng ta làm gì nếu (A = B), nhưng ở đây có vẻ như 'if' đang kiểm tra A so với 1, tôi có đúng không?

Trả lời

10

Đầu tiên, nó gán giá trị của B-A (A = B), sau đó nó sẽ kiểm tra nếu kết quả của nhiệm vụ này, đó là A và đánh giá để 1, bằng 1.

Vì vậy, về mặt kỹ thuật, bạn chính xác: Trên cách nó kiểm tra A chống lại 1.

Để làm cho mọi việc dễ dàng hơn để đọc, mã này là tương đương với:

UINT A, B = 1; 
A = B; 
if(A == 1){ 
    return(TRUE); 
} else { 
    return(FALSE); 
} 
+3

Chỉ vì bạn có thể viết mã theo cách viết trong câu hỏi, không có nghĩa là bạn nên làm như vậy. Bạn nên luôn luôn thích mã như được viết trong câu trả lời này bởi vì nó không có sự mơ hồ. –

+6

Làm thế nào là bản gốc mơ hồ? Nó rõ ràng cho bạn, tis rõ ràng với tôi. – baash05

5

Thay vào đó, mã của bạn luôn được gán B-A, và nó được hơn nữa kiểm tra xem giá trị của B (và do đó cũng A) bằng 1.

Không có gì là "di sản" về vấn đề này, điều này thường là một thành ngữ khá thuận tiện nếu bạn cần là kết quả của một hoạt động mà còn muốn kiểm tra lỗi:

int result; 
if ((result = foo()) != -1) 
{ 
    printf("The result is: %i\n", result); 
} 
else 
{ 
    // panic 
} 
+0

yeah foo() kiểm tra của bạn cũng giống như những fopen() kiểm tra. Mã tôi thấy ở đây là một chút phức tạp hơn, mà làm cho tôi một chút bối rối ... – deddebme

0

đúng. Giá trị A sau khi chuyển nhượng sẽ được so sánh với 1.

mẫu mã này tương đương với chỉ:

return (TRUE); 
+0

Chính xác.Tôi đang tự hỏi nếu có sẽ là một tình huống trong đó nhiệm vụ sẽ thất bại. Nó có ý nghĩa nếu kiểm tra được cho sự trở lại giá trị của một hàm như Kerrek SB đã đề cập. – itisravi

+0

Tôi hy vọng câu hỏi được đặt ra để thể hiện điều này .. B thường sẽ không được biết. – baash05

2

Nếu bạn muốn giữ nó trên 1 dòng:

if ((A = B), A == 1) 

làm điều tương tự.

0

Chúng tôi đang cố gắng tránh các câu lệnh để làm cho mã dễ đọc hơn.

UINT A, B = 1; 
bool fResult = false; 

fResult = (A == B); 

return(fResult); 

Và nếu phải có điều kiện để hành động (không bình đẳng), hãy xem ví dụ này.

UINT A, B = 1; 
bool fResult = false; 

fResult = (A == B); 

if(fResult) 
{ 
    doThis(); 
} 
else 
{ 
    doThat(); 
} 

return(fResult); 
Các vấn đề liên quan