论坛首页 入门技术论坛

入门问题:变量命令规范和变量的放的位置

浏览 2464 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-12-18  
变量是严格的使用匈牙利命名法么?指在公司,而不是个人写的小程序。
个人不喜欢这种命名,虽然看起来好看。但是很多开源的经典代码读没有这种要求。

循环内部的变量一定要放在循环外部么?记得有人说变量声明尽量靠近变量的使用。

很疑惑,请大家讨论一下公司的标准。
   发表时间:2009-12-18  
   命名有含义就行,其它要求不严格.
  声明变量,主要看他的生命周期了. 如果是局部变量,声明在最小使用范围内,最好了,如果是全局变量,范围大,可以声明类的属性,常理类里了
0 请登录后投票
   发表时间:2009-12-18  
那看来我们要求的还是很严格的。而且很多地方和标准还是有很多区别的。。
声明在最小使用范围内,gcc编译器会自动做优化么。把循环内的变量,放在循环外。
0 请登录后投票
   发表时间:2009-12-18  
poson 写道
那看来我们要求的还是很严格的。而且很多地方和标准还是有很多区别的。。
声明在最小使用范围内,gcc编译器会自动做优化么。把循环内的变量,放在循环外。

循环里的变量放在循环外……?
所谓循环不变量代码外提(loop-invariant code motion)是编译器能推导出某个表达式在循环中是不变量时才做的了的,也是这个条件下做了才有意义的。

把变量的scope尽量减小的主要好处应该是减小名字冲突的危险,方便写代码;以及使代码中同一个变量的使用位置尽量集中,方便读代码吧?对编译器来说在哪里声明只是会影响名字查找而已。有些很有效的算法可以把在很前面就初始化、很后面才第一次用的局部变量的初始化给挪到尽量靠近第一次使用处,特别是当控制流简单、易于分析的时候。
0 请登录后投票
   发表时间:2009-12-18  
循环里的变量放在循环外……?
就是说不会重复构造对象。
只构造一次对象。
0 请登录后投票
   发表时间:2009-12-18  
poson 写道
循环里的变量放在循环外……?
就是说不会重复构造对象。
只构造一次对象。

“构造对象”是潜在有副作用的。编译器能帮忙做的外提只能是循环不变量外提,而且还要保证外提之后原本应该发生副作用的时机得到维持。
不知道poson说的是怎样的代码……写一小段举个例就清楚了。

例如说Java和C#之类的语言要求在访问数组的下标越界时抛异常。而像是:
for (int i = 0; i < N; i++) {
  array[i] = i;
}

这种代码是可以把array.length与N在循环之前比较一次,提前得知在循环中数组访问会不会越界,这样就可以消除在循环中的边界检查,实际上也是一种循环不变量外提。但由于Java和C#里访问数组的正确语义是在真的越界的那次访问时才抛异常,在那之前循环里发生的副作用都应该照旧发生才对,所以在得知某个循环里肯定有越界的数组访问之后,程序也不能说干脆就不执行那个循环而直接抛异常出来。因此不是什么东西都能随便提到循环外面,即便真的是循环不变量也不一定能直接提出去就完事。
0 请登录后投票
   发表时间:2009-12-18   最后修改:2009-12-18
poson说的应该是C++类型的代码吧,也就是对象在堆栈中构建,而不是在堆中。
0 请登录后投票
   发表时间:2009-12-18  
fineqtbull 写道
poson说的应该是C++类型的代码吧,也就是对象在堆栈中构建,而不是在堆中。

那也一样,有副作用的东西不能随便移动。如果有
#include <iostream>
using namespace std;

struct Foo {
  Foo() {
    cout << "foo" << endl;
  }
};

int main() {
  for (int i = 0; i < 10; i++) {
    Foo f;
  }
  
  return 0;
}


#include <iostream>
using namespace std;

struct Foo {
  Foo() {
    cout << "foo" << endl;
  }
};

int main() {
  Foo f;
  for (int i = 0; i < 10; i++) {
  }
  
  return 0;
}

显然是不一样的。所以要讨论的话需要一点具体的例子来说明。只是随便说说的话那也罢……
0 请登录后投票
   发表时间:2009-12-18  
我只是想说他那个规范很可能是针对C++语言的,有副作用的情况下完全同意你的意见,只是在没有副作用(比如cout的输出)的情况下,比如

引用
循环里的变量放在循环外……?
就是说不会重复构造对象。
只构造一次对象。


很可能就是指在将实体对象变量的定义放在循环外的话将只构造一次。
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics