有条件的未使用变量

时间:2018-08-11 05:16:38

标签: c cs50

我下面有测试代码,我的程序将允许输入float数字。有一个条件检查浮点值是否小于或等于1但大于0。然后,将以一种方式定义变量bc。如果输入>> 1,则将以另一种方式定义bc。但是,使用下面的代码,该程序始终告诉我bc未被使用。但是我已经在printf中使用了它们。我不知道这是什么错误。谁能解释其背后的原理?

#include <stdio.h>
#include <stdlib.h>


int main (int argc, char* argv[])
{
    float ratio = atof(argv[1]);

    if (argc != 2)
    {
        return 1;
    }

    if (ratio > 0.0 && ratio <= 1.0)
    {
        float b = 3/4;
        float c = 4/5;
    }
    else if (ratio > 1.0)
    {
        float b = 1;
        float c = 2;
    }

    printf("b and c are %f, %f", b, c);
}

3 个答案:

答案 0 :(得分:4)

它与范围有关。如果在范围内声明变量,则该变量在该范围的末尾将不复存在。花括号{和}中的语句在同一范围内。 Read more here

这样做:

int main (int argc, char* argv[])
{
    if (argc != 2) return 1;        

    float ratio = atof(argv[1]);

    float b, c;

    if (ratio > 0.0 && ratio <= 1.0) {
        b = 3.0/4;
        c = 4.0/5;
    } else if (ratio > 1.0) {
        b = 1;
        c = 2;
    }

    printf("b and c are %f, %f", b, c);
}

我也将3/4更改为3.0/4,因为由于整数运算,3/4的值将变为0

您的代码的另一个问题是,在将第一个参数转换为浮点数后,您检查了参数数量。这应该在之前完成。

答案 1 :(得分:3)

您尝试在b行中打印的变量cprintf()实际上仅在if的两个分支内定义。因此,甚至没有为printf()定义它们。

在两个分支elsethen中,分别对其进行了定义和初始化,但此后不再使用。这是编译器以您描述的方式抱怨的部分。

要修复,请为main中的两个局部变量创建一个单独的定义,以便main的所有部分都使用相同的变量并查看定义。

int main (int argc, char* argv[])
{
    float ratio = atof(argv[1]); /* see klutts warning on this line */
    float b = 0.0;
    float c = 0.0;

    /* ... */

然后删除float中的所有其他main()。这将使您编程的初始化定义变成对已定义的公共变量的写访问。否则,您仍然会创建块局部变量,这些局部变量不会在块外部再次使用,甚至对printf()也不可见,这将导致printf()从{{ 1}}。

答案 2 :(得分:2)

if (ratio > 0.0 && ratio <= 1.0) {
        float b = 3/4;
        float c = 4/5; /* variable b & c scopes ends after this block */
}
printf("b and c are %f, %f", b, c); /* here printf doesn't know about b & c, hence it throws the error */

引起两个错误

  

未使用的变量“ c”,未使用的变量“ b”和错误:未声明的“ b”   (此函数的首次使用)错误:未声明“ c”(此函数的首次使用   功能)

因为变量bcif() { }块内声明,并且这两个变量的作用域仅在此块内,而不在外部,所以printf()导致错误因为变量bc不存在,并且由于变量bc未在if块内使用,因此它表示

  

未使用的变量'c'[-Werror = unused-variable]

为避免所有这些错误,请像这样声明变量bc

int main (int argc, char* argv[]) {
        float ratio = atof(argv[1]);
        if (argc != 2) {
                return 1;
        }
        float b = 0, c = 0; /* declare here it self., so that it can be used in both if and else-if block */
        if (ratio > 0.0 && ratio <= 1.0) {
                b = 3./4; /* to get correct arithmetic, use 3. instead of 3 */
                c = 4./5;
        }
        else if (ratio > 1.0) {
                b = 1;
                c = 2;
        }
        printf("b and c are %f, %f", b, c);
        return 0;
}