| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1417 人关注过本帖
标题:询问一个编程习惯的问题
只看楼主 加入收藏
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
[bo][un]qfyzy[/un] 在 2008-9-12 12:46 的发言:[/bo]

我还可以说即使在UNIX下用CC编译,随便补变量是极其不良的习惯。不要尽量想办法去钻空子。
至于说节约空间,可损失的就是时间。所以我建议,除了极少数的变量,别的都在函数头声明的好。


1 凭什么说损失时间?知道变量的分配原理么?局部变量都是在栈上面分配的,而且C/C++编译器可以优化到在进入函数的时候一次分配所有变量。即使不会这么优化,增加一个局部变量也就就是ESP堆栈指针的值加一个字的长度而已。多了一条CPU指令你就无法忍受了?

2 变量随用随写,避免作用域问题,很多NOIPers都习惯在开头用全局变量或者函数开头定义循环变量,结果在内部复杂的过程中变量冲突。很难Debug,这一点我以前有深切体会。变量随用随定义不是偷懒,而是一种“封装”的思想。缩小错误的可能范围,提高代码强健度。

3 变量本身代表的是一种对程序执行“状态”的记录。那么全局变量则代表在整个程序中都有效,或者都必须使用的状态,而局部变量则代表只是在某个部分才会使用的状态。随用随写,可以使状态的定义和使用在一个狭小的范围有效,提高程序紧凑性和可维护性,利于Debug。代码逻辑也会很清晰。

4 可能有人担心,如果在中间定义的变量和后面定义的冲突了怎么办?一种办法是为一个单独功能写一个单独函数,如下:
int func(...)
{
    int var;
    //.....
}

int main()
{
    func();
    //.....
   
    int var; //注意,仅在C++中写这样的代码!!
    //.....
};
如果不喜欢这种方法,也可以把变量放到独立的块中去:
int main()
{
    {
         int var;
         //..........
    }
    //.........
    {
         int var;
         //.........
    }
}
使用块分离功能,提高代码独立性,降低代码耦合。还能提醒程序员,在局部代码开始复杂的时候,及时将独立功能分离成函数。

当然,如果预先就设计好了整个函数的功能,或者函数的功能很简单,也可以将所有的变量声明放在函数头。我的建议是:
[bo]将在某个局部块(包括函数等独立块)使用的变量放在其局部代码开头,一切以清晰,封装,低耦合,易维护为先。[/bo]

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-09-12 16:22
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
[bo][un]落在秋天的叶[/un] 在 2008-9-12 16:15 的发言:[/bo]

在C++中为了防止重名使用命名空间,如果你用C++写一个很大的程序的话,涉及的变量有成千上万个,如果你把他们都声明在一起的话,他们肯定要在一个命名空间了那么就不能重名。要命名这么多的变量多累。如果把代码分成 ...


C的思想是,每个h/c结构相当于C++的一个类。内部使用的变量和函数冠以static,每个部分的函数名冠以其部分的名字,比如:

//widget.h
extern int widget_global_var;
void widget_get_answer();
void widget_put_data();
//....

//widget.c
#include "widget.h"

int widget_global_var;
//....
static int stat;
//....

这样就绝不会重名。办法是人想出来的嘛……

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-09-12 16:30
快速回复:询问一个编程习惯的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.014435 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved