2016-02-17 25 views
7

Kodu:Birisi bu C kodunu açıklayabilir mi?

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 
} 

Nasıl a==1 ve b==0c89 ve c99 yılında b==1?

Karşılığında a içinde a değeri c89 ve c99 içinde b değişikliklerin 1 ve dönüş değeri ne kadar bilmek istiyorum?

+0

Eh, daha fazla ayrıntı ekleyebilirsiniz verir? Şu andan itibaren sorunuzu doğru anlayamıyorum. –

+1

IIRC, diğer C'leri de yapın. –

+0

@AshishAhuja sizeof (enum {b, a}) 4'tür ve sizeof (int) de 4'tür (4! = 4), sonra a ;, a'nın değeri 1 olur? – user123456987

cevap

9

C89 ve C99 davranışı arasındaki fark, enum tanımının kapsamıdır. Gcc'de C89 için iç tanım return b için geçerlidir, C99'da ise dış tanım return b için geçerlidir.

Aşağıdaki örnekte daha net görebilirsiniz: gcc olarak

#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()); 
} 

, C89 mod 7 verir ve C99 modu 6.

İlgili konular