今天,当我编码时,这个问题发生在我身上。 当我们想要定义和使用变量时,我们是否应该扩大其范围?特别是当在几个块语句中使用相同的变量时,这些块语句与这个变量之间没有任何关系。哪个更好?让变量在所有块语句之外,或在每个块语句中定义。举个这样的例子:
FIRST:
int vl_ret = 0;
int b = 1;
int c = 1;
if (b == 1)
{
vl_ret = do_something();
if (vl_ret == 1)
{
printf("1\n");
}
else
{
printf("0\n");
}
}
if (c == 1)
{
vl_ret = do_something();
if (vl_ret == 1)
{
printf("1\n");
}
else
{
printf("0\n");
}
}
或 第二:
int b = 1;
int c = 1;
if (b == 1)
{
iny vl_ret = do_something();
if (vl_ret = 1)
{
printf("1\n");
}
else
{
printf("0\n");
}
}
if (c == 1)
{
int vl_ret = do_something();
if (vl_ret = 1)
{
printf("1\n");
}
else
{
printf("0\n");
}
}
因为这些局部变量是从堆栈中分配的,所以它可以非常快,我们可以忽略第二种方法中分配表单堆栈所花费的时间。
我认为,第二个更好,因为我只需要在每个块语句中使用此变量,如果我不需要它,我可以轻松修改我的代码。在第二种方法中,代码更清晰。我们可以看到,该变量也不会受到其他块语句的影响。
答案 0 :(得分:7)
通常,缩小范围通常会提高可读性和理解度,因为在大多数情况下,它允许您在一个屏幕或更少的屏幕上查看变量的整个生命周期。
没有什么比调试在一个页面上设置变量的一些代码更糟糕了,然后在三页后使用它,特别是如果连接是无意的。
您通常不需要担心使用“太多”变量,因为大多数情况下,编译器会自动处理它们的分配。如果变量不再“活动”,编译器将为您透明地重用存储。
答案 1 :(得分:1)
我认为,第二个更好,因为我只需要在每个块语句中使用此变量,如果我不需要它,我可以轻松修改我的代码。在第二种方法中,代码更清晰。我们可以看到,该变量也不会受到其他块语句的影响。
你认为对。也就是说,如果出现以下情况,您可能偶尔会决定将变量用于不相关的目的:
答案 2 :(得分:0)
我总是建议尽量保持变量的范围尽可能小(尽可能短)。它在阅读代码时更清楚(这个变量做了什么?),并且有助于防止意外地使用变量来处理错误的事情。没有什么比看到bTemp
和bTemp2
在一个函数中重复使用15个位置更糟糕了。
在范围方面,不要担心“太多”变量或任何类型的优化。如果编译器可以确定从不同时使用两个变量(比如第二个例子中的两个vl_ret
变量),那么它可能会将它们放在堆栈的相同位置(就好像它们是相同的变量)。
另外,不要关心堆栈变量的“分配”。通常,在首次调用函数时会设置整个堆栈帧,因此会立即保留所有变量的空间。