2016-02-17 37 views
7

Code:Ai đó có thể giải thích các mã C này?

enum {a, b}; 

int different(void) 
{ 
    if (sizeof (enum {b, a}) != sizeof (int)) 
     return a; // a == 1 
    return b; // b == 0 in C89, b == 1 in C99 
} 

Làm thế nào a==1b==0 trong c89b==1 trong c99?

Tôi muốn biết làm thế nào giá trị của a lại a là 1 và trả lại giá trị của b thay đổi trong c89c99?

+0

Vâng, bạn có thể thêm chi tiết? Hiện tại tôi không thể hiểu câu hỏi của bạn một cách chính xác. –

+1

IIRC, do đó, thực hiện các C khác. –

+0

@AshishAhuja sizeof (enum {b, a}) là 4 và sizeof (int) cũng là 4 có nghĩa là nếu (4! = 4) sau đó trả về a ;, giá trị của a là 1 như thế nào? – user123456987

Trả lời

9

Sự khác biệt giữa hành vi C89 và C99 là do định nghĩa enum nằm trong phạm vi. Trong gcc, đối với C89, định nghĩa bên trong có hiệu lực đối với return b, trong khi trong C99, định nghĩa bên ngoài có hiệu lực đối với return b.

Bạn có thể thấy điều này rõ ràng hơn trong các ví dụ sau:

#include <stdio.h> 

enum {a=5, b=6}; 

int different(void) 
{ 
    if (sizeof(enum {b=7, a=8}) != sizeof(int)) 
     return a; 
    return b; 
} 

int main() 
{ 
    printf("%d\n", different()); 
} 

Trong gcc, chế độ C89 cho 7 và chế độ C99 cho 6.

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