2013-06-16 13 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 

Tôi đã xem qua Câu hỏi này. Như chúng ta biết, chúng ta chỉ có thể khởi tạo thành viên đầu tiên của Union. Nhưng trong trường hợp này, tại thời điểm khởi tạo, biến số y được khởi tạo thông qua một số phương thức đã cho!Cách Giải thích Đầu ra của Liên minh C này

Bất kỳ ai cũng có thể giải thích cho tôi cách k = {.Y = 97} vi phạm quy tắc được nêu trong cuốn sách của Dennis Ritchie "Liên minh chỉ có thể được khởi tạo với giá trị kiểu thành viên đầu tiên" và khởi tạo biến thứ hai thay thế?

+1

Ai nói với bạn, bạn chỉ có thể khởi tạo các thành viên đầu tiên của một số 'union'? Đây là một sai lầm (bạn có thể khởi tạo bất kỳ thành viên duy nhất của một số công đoàn). –

+2

Các initialisers được chỉ định đã được giới thiệu trong c99. dmr không biết về điều đó trong những năm bảy mươi. – wildplasser

+0

Có thể tính cuối cùng đã đảo ngược quy tắc. –

Trả lời

15

K & R là một cuốn sách tuyệt vời, nhưng nó đã cũ. Trong C99 Bạn có thể làm điều này.

Sử dụng một initializer được chỉ định trong ví dụ tương tự, các sau khởi thứ hai tuổi thành viên công đoàn:

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

Cảm ơn vì điều này! –

+0

Bạn nói "K & R ... cũ". Tôi có xu hướng nghĩ rằng, trong thế giới máy tính, 35 năm (ấn bản thứ nhất là 1978) có phần vượt xa "cũ" ... Ngay cả ấn bản thứ 2, mà IIRC là năm 1988, là "cũ" ... – twalberg