带有 if 条件的未使用变量

unused variable with if condition

我有下面的测试代码,我的程序将允许输入 float 数字。有条件检查float值是否小于等于1但大于0。然后,变量 bc 将以一种方式定义。如果输入 > 1bc 将以另一种方式定义。但是,使用下面的代码,程序总是告诉我 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);
}

这与作用域有关。如果您在范围内声明一个变量,它将在该范围的末尾不复存在。大括号内的语句,{ 和 } 在同一范围内。 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

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

您尝试在 printf() 行中打印的变量 bc 实际上仅在 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;

    /* ... */

然后在main()之前删除所有其他float。这会将您编程的初始化定义变成对已定义的公共变量的写访问。否则你仍然创建块局部变量,这些变量不会在块外再次使用,甚至对 printf() 不可见,这将导致 printf() 从 [=] 开始打印初始化值19=].

这个

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 */

导致两个错误,即

unused variable ‘c’, unused variable ‘b’ and error: ‘b’ undeclared (first use in this function) error: ‘c’ undeclared (first use in this function)

因为变量 bc 是在 if() { } 块内声明的,这两个的作用域只会在这个块内,而不是在块外,所以 printf() 导致作为变量 bc 的错误不存在并且由于变量 bc 未在 if 块中使用它说

unused variable ‘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;
}