免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: pmerofc
打印 上一主题 下一主题

[C] 有多少C程序员认为这是错误的写法 [复制链接]

论坛徽章:
0
161 [报告]
发表于 2012-05-13 17:51 |只看该作者
回复 159# walleeee

排除重载,仍然有问题。
[]的操作数之一是指针而不是数组。数组可以通过转换为指针参与内建[]的运算。

论坛徽章:
0
162 [报告]
发表于 2012-05-13 17:52 |只看该作者
回复 157# 幻の上帝


auto这种东西换汤不换药,所谓治标不治本,如果随意使用,我估计不久,大概3年内就有人出来批auto,你信不信?
因为是否auto对编译器而言没什么关系,但是对读代码的人来看简直就是灾难,缺少了必要的类型信息,这确是人理解代码上下文的重要信息。

不如说可以算一类最复杂的迭代器,其它的都比这个简单

所以,给你一把非常锋利的刀,你如今觉得他太快了,就去换一把钝刀?
甚至准备满身都背上各种各样的刀,一些快,一些钝?


总之,我坚持迭代器是给脑残准备的,给了你自由,你却想被束缚,并总能找到各种各样的理由。

论坛徽章:
0
163 [报告]
发表于 2012-05-13 17:53 |只看该作者
回复 161# 幻の上帝


好好好,没问题

论坛徽章:
0
164 [报告]
发表于 2012-05-13 18:01 |只看该作者
回复 162# walleeee


你估计的依据?(比如用了几年说C#有人批var了?)
缺少类型信息的确重要——但是——如果读代码的人清楚这个代码所在的函数/模板所要表达的意图,就不至于弄不清楚fileList.begin()应该会是类似什么样的类型,否则就是代码的质量太差了。注意,很多情况下,表达语义不需要精确的类型,这里正是明确这点,使读者不要把“表达式一定需要具有什么类型”这样的前置条件想得太复杂。

“所以,给你一把非常锋利的刀,你如今觉得他太快了,就去换一把钝刀?
甚至准备满身都背上各种各样的刀,一些快,一些钝?”
——不对,是一把我想要它钝它就钝,想要它快就它快的刀——只要我想得出来钝到什么程度合适。这是更大的自由

论坛徽章:
0
165 [报告]
发表于 2012-05-13 18:16 |只看该作者
回复 162# walleeee

这里我再补充一下。
你看来把不同的迭代器当成不同的“刀”,而我把所有的迭代器当成一把。无疑这把刀比指针这把快刀要复杂。但是,它毕竟还能完成指针用起来不够舒服的、实实在在的任务。此外,不同迭代器之间具有联系,所以所有的迭代器才能被当成一整把刀。‘
你说,在要干活但不知道干什么活的情况下,带一把瑞士军刀好呢,还是带一大堆刀好,或是只带一把刀然后时常发现这把刀“其实还可以更顺手”的好?
如果你之前总是完成只需要快刀的工作,那么或许不会发现多少不够顺手的地方,所以决定只带一把。但你真能确定以后就只用得到一把

论坛徽章:
0
166 [报告]
发表于 2012-05-13 19:09 |只看该作者
回复 165# 幻の上帝


auto的作用,就是方便写代码的人。在我看来就是这样。
并不在于让代码更好理解,最多就是表面上看起来代码清爽一些,这是表面的。

不对,是一把我想要它钝它就钝,想要它快就它快的刀——只要我想得出来钝到什么程度合适。这是更大的自由。

你说的是指针吧?只有指针才能达到这个效果。至于你的迭代器,不可能有这个效果。

“你看来把不同的迭代器当成不同的“刀””
不是我当成,而是不同迭代器之间差别的确很大,本质性的差别,如果用户理解稍有偏差那就是灾难性的后果,但是这些差别之间有很类似,很容易让人就混用了,这一点你可以自己看看那些开源代码中混乱的情况就可以知道。

“而我把所有的迭代器当成一把”
这是你臆想。

无疑这把刀比指针这把快刀要复杂

这个我早就说了,你这里自己也承认。

但是,它毕竟还能完成指针用起来不够舒服的、实实在在的任务

这又是你在臆想。

“此外,不同迭代器之间具有联系,所以所有的迭代器才能被当成一整把刀。”
对,它们的确有联系。不过也有本质差别。

在要干活但不知道干什么活的情况下,带一把瑞士军刀好呢,还是带一大堆刀好

带一把足够用的刀。所以他是指针。而不是迭代器。你这个考虑方式,正好就是符合了c++过度设计的那些考虑,包括现在很多库的设计,就是你这种考虑问题的方式,最后的结果就是庞大无比,繁杂无比,最后自己都控制不住。

或是只带一把刀然后时常发现这把刀“其实还可以更顺手”的好

你是说迭代器更顺手?唉,我从来没觉得迭代器这个恼婵用的东西有什么好。
不知道是迭代器是皇帝的新衣,还是我太愚钝,无法理解他的好。

如果你之前总是完成只需要快刀的工作,那么或许不会发现多少不够顺手的地方,所以决定只带一把。但你真能确定以后就只用得到一把

auto这些有他的用处,也算是一个我还比较喜欢的东西。
对于你的begin/end这种组合,是不是考虑了新标准的foreach这种东西?foreach是好东西,让代码看起来更清晰。但是并非本质改变。


总之,指针是一个好东西。
迭代器根本就是为恼婵准备的。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
167 [报告]
发表于 2012-05-13 19:15 |只看该作者
回复 150# 幻の上帝

扣不出来……不过真要能扣出来,还要flexible array member干嘛?
你这不是坑我嘛{:3_191:}

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
168 [报告]
发表于 2012-05-13 19:25 |只看该作者
回复 150# 幻の上帝

或者换一种角度……

假设某文件格式(描述文件格式时,字节大多指8bit,与C的字节定义不同)是S的不断重复。而S是:
1. 4字节,unsigned类型
2. 前一个域的值那么多字节,字符类型。


如果允许使用文件映射,显然用这样的结构体最方便:

  1. typedef constraint[CHAR_BITS==8? 1: -1];
  2. typedef struct {
  3.       uint32_t n;
  4.       char s[/*这里填什么?*/]
  5. } S;
复制代码
但如果没有C99可用呢……  比如msvc……………………


当然,我自己写代码时会尽量避免,包括char s[1];也避免。宁愿代码写得累一些……
但还是理解那些这样写的代码。确实比好用好写,尤其是格式更复杂一些的时候。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
169 [报告]
发表于 2012-05-13 19:32 |只看该作者
回复 142# pmerofc

就是2楼问的问题呀……
不用二维数组,始终用一维数组p,并用p[ i*line + j ] 去访问。

比如:

  1. typedef struct {
  2.       int row;
  3.       int col;
  4.       unsigned char* data;
  5. } header;

  6. unsigned char buf[12];
  7. header h1 = {3,4};
  8. header h2 = {2,6};
  9. h1.data = malloc(12); // 堆上的自不必说,没法区分它是char[12]还是char[2][6]
  10. h2.data = buf; // 即使是栈上的,也是用一维 char[12]分配
复制代码

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
170 [报告]
发表于 2012-05-13 19:36 |只看该作者
回复 157# 幻の上帝

关于:http://www.haskell.org/haskellwiki/Why_Haskell_just_works

以前听sw83说时不信。自己用用,确实有这样的感觉……只要把编译器斥候舒服了,代码就正确了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP