为什么编译器会将变量“z”重新声明为不同的变量类型?

时间:2015-01-17 21:14:46

标签: c function compiler-errors declaration

我开始学习如何在c中使用函数,我试图创建一个函数来划分整数,但编译器给了我一个错误。我搜索了谷歌,它引导我到这里经常问的问题,但我不明白错误究竟是什么。所以,我正在重新发布它。

请注意,根据编译器的问题是“z not”div“。

以下是代码:

 #include<stdio.h>

float div(int x, int z);
void main()
{
  int n,m;
  float div;
  printf("Enter first number: \n");
  scanf("%d",&n);
  printf("Enter second number: \n");
  scanf("%d",m);
  if(m!=0)
  {
    div=div(n,m);
    printf("%d/%d=%f \n",n,m,div);
  }
}

float div(int x, int z)
{
  int x,z;
  float div;

  if(z!=0){
    div=x/z;
    return div;
  }

}

3 个答案:

答案 0 :(得分:3)

你做错了一些事:

(从BLUEPIXY的评论中,你应该避免使用名称div,因为一些标准库使用它)

#include <stdio.h>

/*Prototypes*/
float divve(int x, int z);
    //^^^^^ Changed name of the function since you have a float variable with the same name in main

int main() {
//^ Default return type of main is int

    int n, m;
    float div;

    printf("Enter first number: \n");
    scanf("%d",&n);
    printf("Enter second number: \n");
    scanf("%d", &m);
              //^ You forgot the address operator here

    if(m != 0) {
        div = divve(n, m);
        printf("%d/%d=%f \n", n, m, div);
    }

    return 0;
  //^^^^^^^^^ Return to end the program nicely 

}

float divve(int x, int z) {

    //Removed second declaration of x and z
    float div;

    if(z != 0){
     //^ Changed y to z since you don't have a y variable in the function | BTW Also you already checked if m is != 0 in the main function
        div = (float)x / (float)z;
        return div;
    }

    return 0;
  //^^^^^^^^^ return something if the if statement fails

}

答案 1 :(得分:1)

问题在于:

float div(int x, int z)
{ //                 ^
    int x,z; // << Two 'z's
    float div;

    if(y!=0){
        div=((float)x) / z; // Add a cast to avoid integer division
        return div;
    }
    return 0;
}

z范围内已有div,因此第二个声明(局部变量)与第一个声明(函数的形式参数)冲突。

请注意,我为return为零时的情况添加了y语句。当控制到达非void函数的末尾时,这将避免未定义的行为。

另请注意,避免使用相同的标识符命名变量和函数是个好主意,因此最好在div中重命名main变量。

答案 2 :(得分:1)

您正在声明与函数div中的函数参数同名的变量。

但是还有更多的问题,按照出现顺序列举它们

  1. 您将函数命名为div(),然后在main()中声明了一个具有相同名称的变量,以存储函数的返回值。

  2. 您的第二个scanf()缺少&,我认为这是一个错字。

  3. 您在x函数中声明了zdiv(),它们是函数参数的名称,然后您测试的是y == 0在任何地方宣布。

  4. 您划分整数,如果z > x0,则会截断结果。

  5. 退出div()函数,如果z == 0没有返回任何值,您可能会返回0或任何有意义的值,表明无法执行操作

  6. 我修复了你的代码,这里是

    float divide(int x, int z);
    
    int main()
    {
        int n, m;
        float quotient;
    
        printf("Enter first number: \n");
        scanf("%d", &n);
    
        printf("Enter second number: \n");
        scanf("%d", &m);
    
        if (m != 0)
        {
            quotient = divide(n,m);
            printf("%d/%d = %f \n", n, m, quotient);
        }
    }
    
    float divide(int x, int z)
    {
        float result;
    
        if (z != 0) {
            result = (float)x / (float)z;
            return result;
        }
        return 0;
    }
    

    您应该为变量赋予有意义的名称,这样可以提高可读性并完全避免这种问题。

    了解我如何将div()函数重命名为更具表现力的名称divide(),以及其中的返回值&#34;这不是严格需要的&#34; ,我将其命名为result以反映计算结果将包含在其中,并在main()divide() a的返回值称为qoutient也让读者期待它可能来自哪里,而不会看到你分配给它的行。