我的C实践(2):联合的妙用
在C语言中,联合类型是一种比较特殊的类型,其多个成员共享一个存储区(为最大成员的长度),一次只能包含一个成员值,会进行内存对齐。对联合类型进行sizeof运算会包括所有成员所需要的存储空间量,还包括成员间和成员后面的填充空间。联合类似于其他语言中的“变体记录”,如果联合的长度很大或者有大量的联合,则可以大大节省存储空间。
1、联合只能一次赋值一个成员,并使用它,但C语言没有提供查询联合上一次赋值所用成员的方法。我们可以定义一个enum,其中各个枚举常量代表union各个成员的标志。然后把union和这个enum封装在一个struct中,当对union的某个成员赋值时,就设置相应的标志,这样就可以跟踪联合的成员赋值。
/* widget.c:用枚举常量来跟踪联合类型的成员赋值 */
#include <stdio.h>
#include <string.h>
enum widget_tag{ /* 联合的各个成员的标志 */
count_widget,
value_widget,
name_widget
};
struct WIDGET{ /* 把union和enum封装在一个struct中 */
enum widget_tag tag;
union{
long count;
double value;
char name[10];
} data;
} x;
typedef struct WIDGET widget;
/* 调用本函数就可以不必考虑联合的上一次赋值所用成员 */
void print_widget(widget w){
switch(w.tag){
case count_widget:
printf("Count: %ld\n",w.data.count);
break;
case value_widget:
printf("Value: %.15f\n",w.data.value);
break;
case name_widget:
printf("Name: \"%s\"\n",w.data.name);
break;
}
}
int main(){
x.tag=count_widget; /* 要给成员count赋值,设置其标志 */
x.data.count=10000;
print_widget(x); /* 会自动打印该成员的值 */
x.tag=value_widget;
x.data.value=3.14159265358979323846;
print_widget(x);
x.tag=name_widget;
strncpy(x.data.name,"Millard",10);
print_widget(x);
return 0;
}
2、如果引用联合的某一个成员,但联合上一次赋值的不是该成员,则是以不可移植的方式使用联合。我们可以利用这个方法来了解计算机内部的一些底层数据表示方法。例如要发现浮点数是如何表示的:
#include <stdio.h>
/* 用联合类型来获取浮点数的底层表示 */
void prin
相关文档:
好久以前做的一个程序,贪心策略实现背包问题,c实现。
总结在这里,以备以后和别人查找。
//背包问题
#include "stdio.h"
#define MAX 10
void main()
{
int w[MAX]={0,10,130,15,60,25}; //存放质量
int v[MAX]={0,30,5,10,20,25}; //存放价值
flo ......
例) 危険なコーディング
1 char cStr[256];
2 ZeroMemory(cStr, sizeof(cStr));
3 &nb ......
1) goto
goto 只能在一个函数内跳转。建议少用,使得程序维护起来容易出错;但是,在有多个循环情况下跳转,有时用goto可以使得问题变得简单。
class A
{
public:
A(){}
~A(){}
};
&nbs ......
C/C++
头文件一览
//////////////////////////////////////////////////////////////////////////
C
头文件
(C89,C95)
(C++98,C++03也包含)
include <assert.h> //诊断库
include <ctype.h> //字符处理函数库
include <errno.h> //错误定义
include <float.h& ......
C语言程序可以看成由一系列外部对象构成,这些外部对象可能是变量或函数。而内部变量是指定义在函数内部的函数参数及变量。外部变量定义在函数之外,因此可以在许多函数中使用。由于C语言不允许在一个函数中定义其它函数,因此函数本身只能是“外部的”。
由于 ......