在循环后面声明变量还是在循环里面声明变量? - 页 6

 
Georgiy Merts:

就我个人而言,我非常不喜欢在程序中散布一堆变量,而且每次都要寻找创建变量的地方。这就是为什么只要有可能,我都会尽量在函数的开头声明变量,一并声明--只是为了看清它们在哪里被创建,并了解它们何时会被删除。

你说的 "分散在整个程序中 "是什么意思? 一个局部变量只在使用它的区块中声明和应用,如果你必须寻找它,那说明你的代码太长了,你找不到它。

在函数的开头声明所有的变量只是一种糟糕的、陈旧的风格。 甚至连Strastrup老头也敦促抛弃这些老式的老C的残余,而采用正确可靠的代码:直接在使用的地方声明一个变量。 难道你没有意识到你的方法充满了很多随机的错误。 你是用东西初始化变量? 还是只是 "轻松",然后清理不可预知的代码行为?)也许曾经由于低功率的硬件和薄弱的编译器,这一切都是合理的,但现在肯定不是。

 
pivalexander:

你总是打趣书本,夸奖自己,但对问题的实质并没有说什么,而是绕着理论走,看了你就明白了......。内存和CPU,CPU和内存,电源--它也用在了那里!

相比之下,那些需要理解我的文本含义的人,以及可恶的程序员总是需要用勺子喂食,用银盘子给一个现成的答案,他们从来不想理解什么。因此,我的建议虽然是针对你写的,但很可能不是为你准备的,而是为那些想学习并使自己的技能得到完善的人准备的。

我相信有两种人--一种是在路上看到耙子,只能通过测试来确定踩在上面的结果;另一种是知道基本物理定律、元素重量数据的人,不用踩在上面就能提前知道结果。

 
Alexey Navoykov:

在函数的开头声明所有的变量只是一种糟糕的陈旧风格--甚至连Strastrup老人都敦促抛弃这些老派的旧C语言的残余,以支持正确和可靠的代码:在使用变量地方直接声明它

我认为,好极了!- 令人信服的是,当在局部范围内使用变量时,不太可能碰到未初始化的变量,或者说是一个在之前使用的变量中的值,编译器不会产生警告,而且搜索这种小麻烦是很乏味的。

通过主题和测试,好吧,大约没有什么,超过5-7%的差异是不可见的,而且在接下来的构建中的行为不会改变,这不是一个事实。

 
Aleksandr Matveev:

那些需要--我的文本的含义的人将会理解,而悲哀的是程序员总是需要咀嚼和给出一个现成的答案的拼盘,他们从来不想理解什么。因此,我的建议虽然是针对你写的,但很可能不是针对你的,而是针对那些想学习并使自己的技能达到完美的人。

我相信有两种人--一种是在路上看到耙子,只能通过测试来确定踩在上面的结果;另一种是了解基本的物理定律、元素重量的数据,不用踩在上面就能预先确定结果。

我相信有两种人--那些有膨胀的崇高感的人,那些来逗你自尊的人,他们对这里的主题没有真正有用的评论,在我看来,他们甚至没有深入研究......

还有那些...不要紧,反正不是你。)

亚历山大-马特维耶夫

我怀疑这个声明的作者不知道处理器、内存和编译器是如何工作的......我敢打赌,你的任何代码都可以被加速至少十倍甚至几百倍。 由于这种低劣的编码员,大多数产品在拥有几十个核心的最强大的计算机上都慢得令人难以忍受,而你只需要思考一下...但有些人认为:"为什么要思考?你必须要编码......"

而且我怀疑你还停留在"87年,从EC1020和ZX Spectrum开始"的水平

"Shitcoder "就是你,这就是为什么你雇用了600人...

没有犯罪

PS: 加快我的代码,好吧,不是几百倍,但至少是几十倍,代码就在这个主题的开头,在第一个帖子里,如果你不是shitcoder,当然可以把我的任何代码加快10倍或100倍,来吧...

 
pivalexander:

我认为有两种人--那些夸夸其谈的人,那些来消遣自我的人,他们在这个问题上没有一个真正有用的评论,在我看来他们甚至没有深入研究过这个问题。

还有那些...不要紧,反正不是你 :)

而且我怀疑你还停留在"从EU1020和ZX Spectrum开始的87年"的水平

"Shitcoder "就是你,这就是为什么你雇用了600人...

没有犯罪

六页的讨论,这样的废话,我悄悄地生气了))))),论坛的堕落是显而易见的 ))

 
Igor Makanu:

我认为,好极了!- 令人信服的是,当在局部范围内使用变量时,不太可能碰到未初始化的变量,或者说是一个在之前使用的变量中的值,编译器不会产生警告,而且搜索这种小麻烦是很乏味的。

对于主题和测试,嗯,没什么,超过5-7%的差异是不可见的,而且在接下来的构建中的行为不会改变,这不是一个事实。

你知道在没有初始化的情况下声明一个局部变量 并不能保证它的数值为零吗?毕竟,它是在栈上创建的,任何东西都可以在那里。

void Func()
{
   int n = 0;// только так
   ....
}
P.S.我自己也陷入了讨论的罪恶之中 ))
 
Igor Makanu:

关于这个问题和测试,嗯,这没什么,可以看到不超过5-7%的差异,而且不能肯定在下一个版本中行为不会改变。

是的,好吧,理想情况下应该没有任何区别,因为这种情况的优化是相当简单的。 而且,即使把循环体放到一个单独的函数中,也会是一样的,我相信。但偏执狂将不得不把这个字符串通过引用拖到一个函数中,使代码复杂化 )
 
Alexey Navoykov:
是的,理想情况下应该没有任何区别,因为这种情况很容易优化。 即使我们把循环体放到一个单独的函数中,也会是一样的,我相信。但偏执狂将不得不把这个字符串通过引用拖到一个函数中,使代码复杂化 )

那里的测试结果在启动时应该有5-15%的浮动,风不是一个实时操作系统。

 
Alexey Volchanskiy:

你知道在没有初始化的情况下声明一个局部变量 并不能保证它的数值为零吗?毕竟,它是在堆栈上创建的,任何东西都可能出现在那里。

P.S. 我自己也陷入了讨论的罪恶之中 ))

)))))哇哦!

SZZ:声明变量时的初始化是编写任何错误最少的代码的基础,...即使是编译器也会告诉你一些东西;)

 
Igor Makanu:

))))),哇!

ZS:声明变量时的初始化是编写任何错误最少的代码的基础。即使是编译器也会在这里说些什么;)

刚刚遇到一群人,他们认为编译器对局部变量 的归零就像对全局变量一样。

而编译器并没有发出任何授权书

void OnTimer()
{
    string st;
    int n;
    Print(st, n);// специально печатаем неиниализированные, варнингов нет
    for (int i = 0; i < 1000; i++)
    {
        st = IntegerToString(i);
    }
}
原因: