2013-08-07 38 views
21

Tôi có thể giả định rằng trong C, toán tử "==" sẽ luôn luôn đánh giá 1 nếu hai giá trị bằng hoặc nó có thể đánh giá các giá trị "true" khác không?Giá trị trả về của toán tử "==" trong C

struct ss { 
    int id; 
}; 

struct os { 
    int sid; 
    int state; 
}; 

int count(struct ss *s, int state) 
{ 
    int num = 0; 
    // foreach o (of type os*) in a hash table 
     num += o->state == state && (s ? o->sid == s->id : 1); 

    return num; 
} 

Vì vậy, o->sid == s->id sẽ trả về luôn 1 hoặc 0 hoặc có thể trả về các giá trị khác?

+1

xem http://port70.net/~nsz/c/c11/n1570.html#6.5.9p3 – Christoph

Trả lời

29

Tôi có thể giả định rằng trong C, toán tử "==" sẽ luôn luôn đánh giá 1 nếu hai giá trị bằng nhau hoặc có thể đánh giá các giá trị "true" khác không?

Vâng, và vì vậy không !=><>=<= tất cả các toán tử quan hệ.

C11 (ISO/IEC 9899: 201x) §6.5.8 toán tử quan hệ

Mỗi phòng trong số các nhà khai thác < (ít hơn),> (lớn hơn), < = (nhỏ hơn hoặc bằng đến) và> = (lớn hơn hoặc bằng) sẽ thu được 1 nếu quan hệ được chỉ định là đúng và 0 nếu nó là false.107) Kết quả có loại int.

9

Việc so sánh (bình đẳng và quan hệ) khai thác (==, !=, <, >, <=, >=) tất cả trở về 0 cho sai và 1 cho đúng - và không có giá trị khác.

Các toán tử logic &&, ||! ít gây rối về toán hạng của chúng; chúng coi 0 là false và bất kỳ giá trị khác 0 nào là true. Tuy nhiên, chúng cũng chỉ trả về 0 cho false và 1 cho true.

1

Tôi có thể giả định rằng trong C, toán tử "==" sẽ luôn luôn đánh giá 1 nếu hai giá trị bằng nhau hoặc có thể đánh giá các giá trị "đúng" khác không?

Vâng, cho một trình biên dịch phù hợp tiêu chuẩn, giả thiết này là đúng:

Ngôn ngữ lập trình - C, §6.5.9 khai thác bình đẳng (http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf):

Mỗi phòng trong số các nhà khai thác sản lượng 1 nếu quan hệ được chỉ định là đúng và 0 nếu nó sai. Kết quả có kiểu int.

9

Từ tiêu chuẩn:

6.5.8 toán tử quan hệ

Mỗi phòng trong số các nhà khai thác < (ít hơn),> (lớn hơn), < = (nhỏ hơn hoặc bằng đến) và> = (lớn hơn hoặc bằng) sẽ thu được nếu quan hệ được chỉ định là đúng và 0 nếu nó sai. Kết quả có loại int.

6.5.9 Bình đẳng khai thác

Các == (tương đương) và! = (Không bằng) khai thác được tương tự như quan hệ khai thác trừ ưu tiên thấp hơn của họ. Mỗi toán tử mang lại 1 nếu quan hệ được chỉ định là và 0 nếu nó sai. Kết quả có loại int. Đối với bất kỳ cặp nào của các toán hạng , chính xác một trong các quan hệ là đúng.

Đối với toán hạng logic (&&, ||):

6.5.13 logic AND (hoặc 6.5.14 logic OR)

Các & & (hoặc Toán tử ||) sẽ thu được 1 nếu cả hai toán hạng của nó so sánh không bằng nhau với 0; nếu không, nó mang lại 0. Kết quả có kiểu int.

Bạn có thể kiểm tra các dự thảo cuối cùng ở đây: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf

Kết luận:

  • Tất cả sự bình đẳng và toán tử quan hệ (==, !=, <, >, <=, >=) trở lại 0 cho false1 cho true.

  • Các toán tử logic (==, ||, !) đối xử với 0 như false và các giá trị khác như true cho toán hạng của họ. Chúng cũng trả về 0false1true.

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