有人告诉我:“声明接近其使用的变量具有价值”。他纠正了我:
void student_score(size_t student_list_size) {
// int exam;
// int average;
// int digit;
// int counter_digits;
for (size_t i = 0; i < student_list_size; i++) {
int exam;
int average;
int digit;
int counter_digits;
我认为这很糟糕,因为这里变量初始化每个循环。什么是真的?
答案 0 :(得分:5)
我鼓励尽可能在本地范围内声明它们,并尽可能接近第一次使用。这使读者更容易找到声明,并查看变量的类型和初始化的内容。当然,编译器会优化它。
答案 1 :(得分:3)
编译器会对这两种方法进行同步优化。但是为了便于将来维护的可读性和易用性,一些人可能更喜欢在循环中声明变量。
答案 2 :(得分:3)
我认为这很糟糕,因为这里变量初始化了每个循环。什么是真的?
给定变量的代码根本没有初始化。
所以这只是个人品味的问题。
答案 3 :(得分:0)
这取决于。在这方面,C和C ++的工作方式不同。 在C中,变量必须在其范围的开头声明(忘了,它取决于你的编译器,尽管它在C99之前的编译器中也是如此,正如评论中所指出的那样 - 谢谢你!) ,在C ++中,您可以在任何地方声明它们。
现在,这取决于。让我们假设以下两段代码:
int i = 0;
while (i < 5) {
i++;
}
while (i < 5) {
int i = 0;
i++;
}
在这种情况下,第一段代码是可行的,因为在第二种情况下,您在每个循环中声明变量。但是,让我们假设以下......
int i = 0;
while (i < 5) {
std::String str = "The number is now " + std::to_string(i);
cout << str << endl;
i++;
}
简而言之,声明变量对您和您的代码最有意义。除非你像大多数事情一样进行微观优化,否则这一切都取决于背景。
答案 4 :(得分:0)
首先,除非您使用-std=c99
,否则这不是有效的C代码。
此外,只要您不在循环中创建悬空指针,就没有问题。
通过这种方式获得的优势在于这些变量处于紧密结合的范围内。
答案 5 :(得分:0)
这似乎是一个有很多个人意见的讨论,所以我会添加我的:我是一个C程序员,喜欢在一个函数(或块)的开头必须声明变量的C规则。首先,它告诉我堆栈布局,所以如果我创建另一个错误(我做“occassionaly”)并覆盖某些东西,我可以从堆栈布局确定原因。然后,当必须通过C ++代码时,我总是要搜索声明变量的位置。我宁愿看一下函数的开头,看看它们都是整齐地宣布的。
我偶尔想写(int i = 0; ...并且知道变量超出了for循环的范围(我希望它超出范围,因为它是在块开始之前声明的)。
然后在另一个答案中有一个例子:
while (i < 5) {
int i = 0;
i++;
}
我希望它不起作用,因为如果它工作就意味着必须有一个我在此循环之前声明的变量,所以你有一个变量和范围的冲突,调试可能很糟糕(循环永远不会终止,因为错误的i递增)。我的意思是,我希望所有变量必须在使用前声明。
我相信你必须有一个纪律来宣布你的变量。只要很容易找到声明变量的位置及其范围,该规则可能因人而异。
答案 6 :(得分:-1)
您需要了解一些局部变量的知识吗?
在函数内声明的变量称为局部变量。局部变量也称为自动变量。
范围:可以访问变量的区域称为变量范围。
局部变量的范围: 局部变量只能在声明它的函数中使用。
终身: 变量存在于存储器中的时间段称为变量的寿命。
本地变量的生命周期: 当控制进入声明它的函数时,局部变量的生命周期开始,当函数或块存在控制时,它会被销毁。
void student_score(size_t student_list_size) {
// int exam;
// int average;
// int digit;
// int counter_digits;
/* The above variable declared are local to the function student_score and can't be used
in other blocks. In your case its the for loop. */
for (size_t i = 0; i < student_list_size; i++) {
int exam;
int average;
int digit;
int counter_digits;
...
/* The above declared variable are local to the for loop and not to the function.*/
考虑这个例子:
#include<stdio.h>
void fun();
int main()
{
fun();
return 0;
}
void fun()
{
int i,temp=100,avg=200;
for (i=0;i<2;i++)
{
int temp,avg;
temp = 10 + 20;
avg = temp / 2;
printf("inside for loop: %d %d",temp,avg);
printf("\n");
}
printf("outside for loop: %d %d\n",temp,avg);
}
Output:
inside for loop: 30 15
inside for loop: 30 15
outside for loop: 100 200
如果要在循环中声明变量,则将变量声明为static
(如果要保存/用于进一步迭代的变量值)。
甚至编译器也花费大量时间在循环中初始化变量。
我的建议是在函数的开头声明。它是一个很好的编程习惯。
我想,我明白了我的意思。