-1

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

3 回答 3

4

它与范围有关。如果您在一个范围内声明一个变量,它将在该范围的末尾不再存在。大括号内的语句 { 和 } 处于同一范围内。在这里阅读更多

这样做:

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/43.0/4, 因为整数算术3/4将评估为。0

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

于 2018-08-11T05:21:59.657 回答
3

您尝试在行中打印的变量实际上b仅在. 因此,它们甚至没有为.cprintf()ifprintf()

在两个分支中,theelse和thethen分开,它们被定义和初始化,但之后再也没有使用过。这是编译器以您描述的方式抱怨的部分。

要解决此问题,请在 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;

    /* ... */

然后删除所有其他floats witin main()。这会将您编程的初始化定义转换为对已定义的公共变量的写访问。printf()否则,您仍然会创建块局部变量,这些变量不会在块之外再次使用,甚至printf()main().

于 2018-08-11T05:25:35.553 回答
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”未声明(在此函数中首次使用)

因为变量bc声明在if() { }块内,这两个的范围将只在这个块内,而不是在外面,所以printf()导致错误作为变量b并且c不存在并且因为变量b并且c不在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;
}
于 2018-08-11T05:36:58.343 回答