2013-06-16 3 views
14
#include <stdio.h> 
union p 
{ 
    int x; 
    char y; 
} 
k = {.y = 97}; 

int main() 
{ 
    printf("%d\n", k.y); 
    return 0; 
} 

OUTPUT: 97 

Я столкнулся с этим вопросом. Как мы знаем, мы можем только инициализировать первого члена Союза. Но в этом, во время инициализации, переменная y инициализируется некоторым способом!Как объяснить этот выход C-союза

Может кто-нибудь объяснить мне, как к = {.Y = 97} нарушают правила, указанные в книге Денниса Ритчи «Союз может быть инициализирован только со значением типа его первого элемента» и инициализацией вторая переменная?

+1

Кто сказал вам, что вы можете только инициализировать первый элемент некоторого 'union'? Это ошибка (вы можете инициализировать любой член какого-либо объединения). –

+2

Назначенные инициализаторы были введены в c99. dmr не знал об этом еще в семидесятых годах. – wildplasser

+0

Может быть, контрреволюция изменила правило. –

ответ

15

K & R - отличная книга, но она старая. В C99 Вы можете это сделать.

Используя назначенный инициализатору в том же примере, следующий инициализирует второй член союза возраст:

union { 
     char birthday[9]; 
     int age; 
     float weight; 
     } people = { .age = 14 }; 
+0

Спасибо за это! –

+0

Вы говорите: «K & R ... старый». Я думаю, что в компьютерном мире 35 лет (1-е издание 1978 года) несколько вышло за рамки «старого» ... Даже второе издание, которое IIRC было в 1988 году, «старым» ... – twalberg

Смежные вопросы