Re: Re: Re: Re[2]: [cpp] cloudwu大哥,请解释一下网易互动笔试题目的意义所在 8230; 8230;
小陈
iamchenxin at 163.com
Thu Mar 23 16:11:42 CST 2006
-----原始邮件-----
发件人:"evilangel"
发送时间:2006-03-23 11:19:38
收件人:"C++ Discuss Group"
抄送:(无)
主题:Re: Re: Re[2]: [cpp] cloudwu大哥,请解释一下网易互动笔试题目的意义所在 8230; 8230;
小陈,您好!
不是很多书认为buf的实际意义是一个指针, 而是在 C 标准中, 函数参数中的数组都会被认为是指针.
这么规定是为了避免对数组的内容进行拷贝, 是出于效率上的原因.
> 对于这个问题, MS 上有句大胆的这个话 8220;The sizeof operator yields the size of its operand with respect to the size of type char. 8221; 主要是一直以来使用vs集成的msdn用惯了,也就始终偷懒没有去下c++ standard . 不知道是MS独家还是真的是标准。
>
>关于sizeof,有个地方还需要注意一下。
>
>对于数组来说,sizeof并不一定总是返回数组大小。
>
>比如 fuc(int buf[5]){sizeof(buf);} sizeof(buf)=4
>
>很多书认为产生这种情况是因为buf的实际意义是一个指针(虽然实际上是个指针,buf产生了地址),所以要按指针的规则来计算。
>
>但是从编译器角度看有相同转化的情况下 fuc(short& buf){sizeof(buf);}sizeof(buf)=2,这里尽管buf也被强迫的产生了地址,但是sizeof(buf)的大小还是按照buf引用的类型来计算的。
>
>所以我觉得fuc(int buf[5]){sizeof(buf);} sizeof(buf)=4 大概是为了给类似int buf[]的声明给一个交代。大致上buf[5]和buf[]在所有情况下保持一致性,总比buf[]有一个独一无二的规则来的好?
>其实我觉得发这篇讨论的人挺可怜的,给人骂惨了。其实说不定他真是笔试的时候一时恍惚,然后就被这题给刷下来了,心里不服气也是很正常。恍惚也是常有的,象回帖子的人里不也有恍惚了把int buf[]="aaa" sizeof(buf)当指针看的么?
致
礼!
evilangel
evilangel2000 at 163.com
2006-03-23
_______________________________________________
Cpp mailing list
Cpp at codingnow.com
http://codingnow.com/mailman/listinfo/cpp
呵呵,可能是我钻牛角尖了,不过我还是觉得这是由于实质上 由于为了保持 int buf[] 和 int buf[5] 在sizeof下面保持的一致性才产生的结果。毕竟对于参数的int buf[] sizeof 在编译时是无法求值的(按照c++的单独编译模型无法求值)。其实在这里也是体现了语言的现实性,不然数组又怎么会无法引用? 如果不考虑编译器的局限性的话,我想c++ standard 未必会真的把参数 int buf[5] 给当成 指针,毕竟 参数 int buf[5] 在函数传值才是真的符合语义。如同其他类型一样,传入类型本身代表传值,不传值的话就要求程序员手动传入引用或者指针。 C和C++的口号向来是 要相信程序员,相信程序员明白自己在做什么。 说白了现在这样的规定是 由于 c++使用的单独编译模型的局限性造成的。 不然C++ 会不相信程序员要传入 int buf[5],是想进行传值, 会不相信程序员不知道不传值需要自己手动传指针和引用?按理说 int buf[5] 传值才是符合语言规范的。毕竟连class A{int buf[2222];};; 这种当参数传入时都是传值进入的。说是为了效率只是一厢情愿的借口。
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://codingnow.com/pipermail/cpp/attachments/20060323/da69a108/attachment.html
More information about the Cpp
mailing list