C语言位字段问题
下面程序中红色标出的box.us_view是怎么被初始化的,没看懂。 Union变量被初始化之后, 难道不是只储存了位字段吗?box.us_view没有初始化,怎么会有值,程序代码:
#include<stdio.h> #include<limits.h> #include<stdbool.h> //位字段符号常量 //边框线样式 #define SOLID 0 #define DOTTED 1 #define DASHED 2 //三原色 #define BLUE 4 //100 #define GREEN 2 //010 #define RED 1 //001 //混合色 #define BLACK 0 #define YELLOW (RED|GREEN) //011, 3 #define MAGENTA (RED|BLUE) //101, 5 #define CYAN (GREEN|BLUE) //110, 6 #define WHITE (RED|GREEN|BLUE) //111, 7 //按位方法中用到的符号常量 #define OPAQUE 0x1 #define FILL_BLUE 0x8 #define FILL_GREEN 0x4 #define FILL_RED 0x2 #define FILL_MASK 0xE #define BORDER 0x100 #define BORDER_BLUE 0x800 #define BORDER_GREEN 0x400 #define BORDER_RED 0x200 #define BORDER_MASK 0xE00 #define B_SOLID 0 #define B_DOTTED 0x1000 #define B_DASHED 0x2000 #define STYLE_MASK 0x3000 const char *colors[8] = { "black","red","green","yellow","blue","magenta", "cyan","white" }; struct box_props{ bool opaque : 1; unsigned int fill_color : 3; unsigned int : 4; bool show_border : 1; unsigned int border_color : 3; unsigned int border_style : 2; unsigned int : 2; }; union Views { struct box_props st_view; unsigned short us_view; }; void show_settings(const struct box_props *pb); void show_setting1(unsigned short); char *itobs(int n, char *ps); int main(void) { //创建Views联合,并初始化struct box view union Views box = { {true,YELLOW,true,GREEN,DASHED} }; char bin_str[8 * sizeof(unsigned int) + 1]; printf("Original box settings:\n"); show_settings(&box.st_view); printf("\nBox settings using unsigned int view:\n"); show_setting1(box.us_view); printf("bits are %s\n", itobs(box.us_view, bin_str)); box.us_view &= ~FILL_MASK; //把表示填充色的位清0 box.us_view |= (FILL_BLUE | FILL_GREEN); //重置填充色 box.us_view ^= OPAQUE; //切换是否透明的位 box.us_view |= BORDER_RED;//错误的方法 box.us_view &= STYLE_MASK; box.us_view |= B_DOTTED;//把样式设置为点 printf("\nModified box setting:\n"); show_settings(&box.st_view); printf("\nBox settings using unsigned int view:\n"); show_setting1(box.us_view); printf("bits are %s\n", itobs(box.us_view, bin_str)); system("pause"); return 0; } void show_settings(const struct box_props *pb) { printf("Box is %s.\n", pb->opaque == true ? "opaque" : "transparent"); printf("The fill color is %s.\n", colors[pb->fill_color]); printf("Border is %s\n", pb->show_border == true ? "shown" : "not shown"); printf("The border color is %s.\n", colors[pb->border_color]); printf("The border style is "); switch (pb->border_style) { case SOLID :printf("solid.\n"); break; case DOTTED:printf("dotted.\n"); break; case DASHED: printf("dashed.\n"); break; default :printf("unknown type.\n"); } } void show_setting1(unsigned short us) { printf("Box is %s.\n", (us&OPAQUE) == true ? "opaque" : "transparent"); printf("The fill color is %s.\n", colors[(us>>1)&07]); printf("Border is %s", (us&BORDER) == true ? "shown" : "not shown"); printf("The border color is %s.\n", colors[(us >> 9) & 07]); printf("The border style is "); switch (us&STYLE_MASK) { case SOLID:printf("solid.\n"); break; case DOTTED:printf("dotted.\n"); break; case DASHED: printf("dashed.\n"); break; default:printf("unknown type.\n"); } } char *itobs(int n, char *ps) { int i; const static int size = CHAR_BIT * sizeof(int); for (i = size - 1; i >= 0; i--, n >> 1) ps[i] = (01 & n) + '0'; ps[size] = '\0'; return ps; }