关于下面程序的分析
typedef struct { int A[10]; } struct_A;
int A1[10], A2[10];
int main( void ) { ... *(struct_A*)A2 = *(struct_A*)A1; ... while ( 1 ) ; }
一,首先分析一下数组定义
int A1[10];
上面定义了一个类型为int的变量序列A1[0]...A1[9],和一个指向类型int的常数指针A1。所以数组并非是一个完整的数据类型。
二,再考察一下赋值符“=”
y = x;
上面是很普通的一条赋值语句,其中赋值符的缺省语义(注意这里的“缺省”两字)是把变量x的值按其“类型”和“原顺序”复制到变量y上。要注意的两点是:其一无论变量的类型有多大多复杂都可以复制,只要是这个类型存在;其二x和y的类型不要求完全一致,只要符合“包容”关系。
有了这两条就不难分析上叙程序的含义了。
首先看(struct_A*)A2和(struct_A*)A1,这叫“指鹿为马”,将原本指向类型int的指针强行指向类型struct_A。然后可以看到再在其基础上去指定一个类型为struct_A的变量——*(struct_A*)A2和*(struct_A*)A1。这样一来再用赋值语句去复制此变量的内容就顺理成章了。
现在再从另一角度来看一下上面的程序,发现可用三个词来概括就是:
1,指鹿为马,前面已经看到了。 2,漏馅封装,一眼就能看出,太明显了。 3,软件冗余,在硬件上冗余是件好事,可到了软件事情就不是这样了。当然可用#define N 10来消除,但还是碍眼。
C能发展到今天其实可以归功于两类人,一类是将C和UNIX捆绑的那些专家,另一类就是那些专门玩玄的玩家。正因为有这些专家,使得C在各个领域(特别是开源领域)有了充分的应用;而也因为有了这些玩家,使得C能被更广泛的流传,现已变成了最为流行的编程语言。 |