C语言一道面试题

[复制链接]
46870|251
mohanwei 发表于 2008-3-20 19:46 | 显示全部楼层

要实现楼主的题目很简单:先#define A=B memcpy(……


然后:
A=B;
……搞定
yxiany 发表于 2008-3-20 21:32 | 显示全部楼层

ss

呵呵,强制转换成字符串,然后赋值,再转换回来
 楼主| wxj1952 发表于 2008-3-21 11:08 | 显示全部楼层

对象很高深吗?

我是学化工的,C语言完全自学。
菜鸟的理解:
“对象是内存中一段连续的(有定义的)数据。”

一个数组在内存中是连续放置的,一个结构也是,一个函数也是一个对象。

同为对象,数组为什么不能赋值,而结构却可以?21楼应用了这里C语言确定的概念。(个人认为)
什么概念?

请教各位专业学长,老师在讲C函数的时候,讲没讲过“函数的调用开销”?

这里瞎说一句,C语言缔造者会不会在结构赋值(变量赋值)语句中加入额外的函数调用开销?我认为大师不可能这么做事。唬人呢。
 所以: A=B;一定比memcpy()快。并且其中不可能调用了任何函数。

既然都是认真的人,我把A=B;形式编译后的code 贴出来看。



dld2 发表于 2008-3-21 11:12 | 显示全部楼层

嘿嘿

关于对象:lz找本C++的书稍微看下。
computer00 发表于 2008-3-21 11:27 | 显示全部楼层

呵呵,对象...类...方法...属性...实例...

HWM 发表于 2008-3-21 11:30 | 显示全部楼层

昨晚面壁思过,在脑子里生成了一些想法,在此一吐为快。

关于下面程序的分析

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能被更广泛的流传,现已变成了最为流行的编程语言。
dld2 发表于 2008-3-21 12:13 | 显示全部楼层

俺以为

能够直接访问内存(以及memory_map的寄存器),是C的基本特性(甚至是核心特性)。
尤其是在嵌入式应用上,体现得很明显。
xhtxzxw 发表于 2008-3-21 12:25 | 显示全部楼层

嘿嘿

绝对只用一行语句而不需要在任何地方增加别的语句或定义的写法是:

*(struct AB{int x[10];}*)b = *(struct AB*)a;

欢迎继续!看能不能整出更简洁的写法?
zyok 发表于 2008-3-21 12:51 | 显示全部楼层

学习了...

gyt 发表于 2008-3-21 12:57 | 显示全部楼层
 楼主| wxj1952 发表于 2008-3-21 22:25 | 显示全部楼层

向各位学到很多以前没想到的知识。

先承认自己一个错误:回来做了一下实验,发现上一帖(44楼)说错了话,结构赋值看起来代码简洁,实际编译后的OBJ与memcpy()长度一样,也有调用开销。不比memcpy()快。
    所以圈圈说的对,都是先设置好指针及所要传输的字节数,然后
        LCALL ?C_COPY

敬佩47楼HWM的认真。想请教几个问题:
1、为什么你说“数组并非是一个完整的数据类型。”
    我看书上说数组类型的写法 int [ ]; 这与int/char/...是一样的。
2、y=x; 不同长度的变量能算同类型吗?(不同类型当然不能互相赋值,)你说的是不同长度也能赋值,(当然是长度小的赋予大的)。

   我说一下我的理解:  
 楼主| wxj1952 发表于 2008-3-21 22:35 | 显示全部楼层

49楼的写法显示个性,独立不羁

向你学习。正所谓不是做不到,而是(我)想不到。
孤独泪 发表于 2008-3-21 23:20 | 显示全部楼层

我认为有结构体实现这个功能是可以的

icecut 发表于 2008-3-21 23:20 | 显示全部楼层

呵呵,不懂

struct 类型 a=struct 类型 b
只能这么猜了。
fsaok 发表于 2008-3-22 09:06 | 显示全部楼层

在所有的答案中

我最欣赏的是2楼的答案

为什么?因为2楼的答案,所有人都看得明白,

程序不是越高深越好,而是越容易看得明白越好,在大量的C语句中,如果每个语句都要想半天,这个程序就没法审核了。更不要说修改

我做过的项目中,大量的不是一次定型,而是不断修改,不光是自己的问题,有时更是客户问题,过半年或者一年修改一次要求,当然这个修改费用,客户会给,但每修改一次,程序就简单化一次,最后发现所有技巧性的东西,基本上都是自找麻烦
huangqi412 发表于 2008-3-22 09:11 | 显示全部楼层

又学到了一点

HWM 发表于 2008-3-22 11:36 | 显示全部楼层

re 52楼:不仅数组不是独立的类型,在C中字符串也不是。

关于赋值复制操作,在某些情况下不一定要求类型完全一致,如int和char,但不建议使用。

其他问题不知所云,所以没法回答。

另外,这个题目就软件工程学的角度来看没啥意义,因为其解的形式必定是“怪异”的,具体我在47楼已经说了,自己去体会吧。

软件就工程学的角度来看,有一套另外的评判体系。并不是越“巧妙”甚至越“怪异”越好的。
computer00 发表于 2008-3-22 12:38 | 显示全部楼层

再扯一句,这些只是人为约定而已,

如果编译器想要实现数组的直接整体赋值还不是轻而易举的事情?

另外,通常我们认为数组名是指针常量。当然了,有些教材上也把常量看做是一类特殊的变量,
就是值不能改变的变量。不过争论这个就没啥意思了。
yuanjian79 发表于 2008-3-22 13:35 | 显示全部楼层

这个压轴题确实不敢恭维!

这个压轴题确实不敢恭维!
yewuyi 发表于 2008-3-22 14:25 | 显示全部楼层

真正天天做项目的人都会同意fsaok

fsaok 发表于 2008-3-22 09:06 侃单片机 ←返回版面    

57楼: 在所有的答案中 

我最欣赏的是2楼的答案

为什么?因为2楼的答案,所有人都看得明白,

程序不是越高深越好,而是越容易看得明白越好,在大量的C语句中,如果每个语句都要想半天,这个程序就没法审核了。更不要说修改

我做过的项目中,大量的不是一次定型,而是不断修改,不光是自己的问题,有时更是客户问题,过半年或者一年修改一次要求,当然这个修改费用,客户会给,但每修改一次,程序就简单化一次,最后发现所有技巧性的东西,基本上都是自找麻烦
 
 
::如果是俺招人,俺只要2楼的答案~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部