- 论坛徽章:
- 0
|
原帖由 OwnWaterloo 于 2009-12-21 18:18 发表 ![]()
char a[] = "hello";
char* p;
for ( p = a+sizeof(a)-2; p>=a; p-- )
printf("%c\n", *p );
与:
for ( p = a+sizeof(a)-2; p!=a; p-- )
printf("%c\n", *p );
效果是一样的: 如 ...
嘿嘿,我理解你的意思,觉得标准都规定了好了,为什么就不好好按标准写呢。
这里面一是有历史原因,一是不方便。
比如你这里这个例子
for ( p = a+sizeof(a)-1; p!=a /* or p>=a */; ) {
--p;
printf("%c\n", *p );
}
先--p就把空字符去掉了,很可能别人原意就要打印这个空字符。p!=a,又少打一个h,所以我在写这个例子时都是跳出循环后再打一次。
标准规定的是完美情况,但现实中要想写出完美的代码时很难的,所以我说有一些既成事实的标准。比如说按标准写:
int a = 70000;
严格来说这样写是不对的,因为不知道这个int的长度,如果是2字节,它就溢出了。怎么办呢,写成
int32_t a = 70000;
是保险的。这意味着我们就不随便使用int、short、long之类的变量的,一定要#include <stdint.h>。但那么多的教材、那么多的书籍都在这样用,
从一学C语言就开始这样用,突然就告诉说这样不对,不严格,在某些情况下会出错。但实际上99%的时间我们写不是跨平台程序,要把所有细节都严格按照标准,
基本上就寸步难行了。所以对于这种情况,人们大都follow的那些即成事实的标准。也正是因为有这些既成事实的标准了,所以几乎也不会出现你说那种特殊的编译器,出现了也不会被市场接受。
历史原因也有很多,比如大家都知道宏不好,定义常量会污染名字空间,应该用enum。写函数没有类型检查,应该用inline函数。但它就用了这么久了,那么多知名项目都在用,都这样用,所以也有很多人follow。
OwnWaterloo你可能是个追求完美的人,但现实中大部分时候都不是完美的。我倒不是鼓励大家不遵守标准,我只是从我的观点陈述一种事实,即它可能不符合标准,但它99%的时间不会出错,至于如何抉择,就看个人了。
>>算了, 别人写的代码是否可移植关我鸟事 …… 大家爱怎么写就怎么写好了……
至于这个嘛,你也别急,现实中和别人意见相左的情况很多,其实我们只要了解了别人的观点,理解他的出发点,然后在心中坚持自己的理念即可。至于别人怎么做怎么想,那真是管我们鸟事 |
|