最后一步input会被初始化为0

为什么我的input到最后一步被初始化成0了

#include
void menu()
{
    printf("*********************************\n");
    printf("*****1.加           2.减*********\n");
    printf("*****3.乘           4.除********\n");
    printf("*********************************\n");
}
int add(int n,int *p)
{
    int i = 0;
    int ret = *p;
    for (i = 1 ;i < n; i++)
    {
        ret= ret +*(p + i);

    }
    return ret;
}
int jian(int n, int* p)
{

    int i = 0;
    int ret = *p;
    for (i = 1;i < n; i++)
    {
        ret = ret - *(p + i);

    }
    return ret;
}
int cheng(int n, int* p)
{
    int i = 0;
    int ret = *p;
    for (i = 1;i < n; i++)
    {
        ret = ret * *(p + i);

    }
    return ret;
}
int chu(int n, int* p)
{
    int i = 0;
    int ret = *p;
    for (i = 1 ;i < n; i++)
    {
        ret = ret / *(p + i);

    }
    return ret;
}
int main()
{
    int input = 0;

    do {
        menu();
        int arr[1000] = { 0 };
        int ret = 0;
        int input = 0;
        int i = 0;
        printf("请选择你想要的\n");
        scanf("%d", &input);

        printf("你想要的数据\n");
        do
        {
            scanf("%d", &arr[i]);
            i++;
        } while (getchar() != '\n');
        int n = i + 1;
        int* p = arr;
        int (*paarr[5])(int, int*) = { 0,add,jian,cheng,chu };
        ret = (*paarr[input])(i, arr);
        printf("%d\n", ret);
    }while (input);

     return 0;
}


int main()
{
   int input = 0;
   int arr[1000] = {0};
   int (*paarr[5])(int, int *) = {0, add, jian, cheng, chu};
   while (1)
   {
      menu();
      int n = 0;
      printf("请选择你想要的\n");
      scanf("%d", &input);
      if (input == 0)
         break;

      printf("你想要的数据\n");
      while (~scanf("%d", &arr[n])) // ctrl+Z结束
      {
         n++;
      }
      n++;

      int ret = (*paarr[input])(n, arr);
      printf("%d\n", ret);
   }

   return 0;
}

把62行的“int input=0”删去即可。

img


input为0的原因:在循环内定义的变量,作用域为循环内部,所以62行的input变量作用域到77行为止;而循环的条件判断是在循环外部,无法搜到循环内部的变量,所以78行的input变量是56行定义的,不是62行定义的(将56行定义的input删掉就会在78行报错)。循环内可以搜到循环外的变量,但在循环内已经搜到同名变量的情况下,不会继续向外搜索,所以输入语句只给循环内的input变量(62行)赋值了,没有给循环外的input变量(56行)赋值,循环外的input变量(56行)始终等于0,于是在进行判断时,无论输入的是多少,都会发现input(56行)等于0。
C语言基础:变量的作用域

因为第56行 和 第62行定义了两个同名的变量 input,但这两个变量的作用域的范围不同,出现误操作。