我有一个用c编写的代码,基本上它接收一个数组并向后打印。一个非常基本的东西。这是代码:
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <limits.h>
#include <stdbool.h>
int main(){
int n;
scanf("%d",&n);
int *arr = malloc(sizeof(int) * n);
for(int arr_i = 0; arr_i < n; arr_i++)
{
scanf("%d",&arr[arr_i]);
}
for(arr_i=n-1; arr_i >= 0;arr_i--)
{
printf("%d ",arr[arr_i]);
}
return 0;
}
第二个for循环出现以下错误:
solution.c:17:9:错误:'arr_i'未声明(首次在此函数中使用)
for(arr_i=n-1; arr_i >= 0;arr_i--)
当我在第int
个循环中的arr_i
之前插入for
时,错误就会消失。
所以,我怀疑为什么即使我已经在第一个arr_i
循环中声明了for
,它还要求我在第二个for循环中再次声明它?
答案 0 :(得分:6)
arr_i
的范围仅限于第一个for
循环。在第二个循环中,是不存在。
引用C11
,章节§6.2.1
[...]如果是声明符或类型说明符 声明标识符出现在块内或参数声明列表中 一个函数定义,标识符有块作用域,它终止于 相关块。 [...]
详细说明,for
循环的可用sytax之一是
for ( declaration expressionopt ; expressionopt ) statement
在您的情况下使用。由于arr_i
的声明出现在for
循环的子句-1 中,因此范围仅限于循环范围,因此,标识符在循环外是未声明的。
如果要在两个循环中使用相同的变量,请在整个函数的块作用域中定义变量,在本例中为main()
函数。
那就是一般建议,在使用返回的指针之前总是检查malloc()
是否成功。
注意:如您所述,
当我在第二个for循环中的“arr_i”之前插入int时,它会消失。
值得一提的是,在这种情况下,两个不同的范围中存在两个不同的变量。它们不是同一个变量。
答案 1 :(得分:0)
正如Sourav Ghosh已经指出的那样,当你在for(这种情况)中声明一个变量时,该变量只存在于该循环中。例如:
void test ()
{
int normal_variable = 5;
{
int local_variable = 10;//only exists here
printf("It compiles: %d and work.\n", local_variable);
printf("It also works: %d",normal_variable);
}
printf("Doesn't compile because doesn't exists: %d.",local_variable);
printf("It also works, because it already exists: %d",normal_variable);
}
括号是使这成为可能的括号。 如果您想了解更多信息,请查看:
答案 2 :(得分:0)
这就是for循环的一个很好的特性,与while循环相比,变量只与For块结构一样长,你可以在for block参数中声明它。因此,只需在结构之外(之前)声明它,您就会发现,了解有关范围和变量生命周期的更多信息。
int main(){
int n;
scanf("%d",&n);
int *arr = malloc(sizeof(int) * n);
int arr_i = 0;
for( ; arr_i < n; arr_i++)
{
scanf("%d",&arr[arr_i]);
}
//
for(arr_i=n-1; arr_i >= 0;arr_i--)
{
printf("%d ",arr[arr_i]);
}
return 0;
}
同样查看你的代码n没有给出任何值,你可以解决它但它没有值(它实际上是一个未确定的值),malloc(sizeof(int)* n)将是4bytes *(未确定)..所以如果有的话,把它设置为0。我不确定这是否是一些伪代码,但这有错误,我会为你写,但既然你开始你应该自己做:)练习是完美的。如果您需要更多帮助,请说出评论。
答案 3 :(得分:0)
变量的范围是重要的。
第一个循环中的第一个声明具有该循环的范围
所以它在第二个循环中不可见。