用C / C ++声明变量

时间:2014-12-29 07:53:11

标签: c++ c

有人告诉我:“声明接近其使用的变量具有价值”。他纠正了我:

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;

我认为这很糟糕,因为这里变量初始化每个循环。什么是真的?

7 个答案:

答案 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(如果要保存/用于进一步迭代的变量值)。

甚至编译器也花费大量时间在循环中初始化变量。

我的建议是在函数的开头声明。它是一个很好的编程习惯。

我想,我明白了我的意思。