我下面有测试代码,我的程序将允许输入float
数字。有一个条件检查浮点值是否小于或等于1
但大于0
。然后,将以一种方式定义变量b
和c
。如果输入>> 1
,则将以另一种方式定义b
和c
。但是,使用下面的代码,该程序始终告诉我b
和c
未被使用。但是我已经在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);
}
答案 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
行中打印的变量c
和printf()
实际上仅在if
的两个分支内定义。因此,甚至没有为printf()
定义它们。
在两个分支else
和then
中,分别对其进行了定义和初始化,但此后不再使用。这是编译器以您描述的方式抱怨的部分。
要修复,请为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”(此函数的首次使用 功能)
因为变量b
和c
在if() { }
块内声明,并且这两个变量的作用域仅在此块内,而不在外部,所以printf()
导致错误因为变量b
和c
不存在,并且由于变量b
和c
未在if
块内使用,因此它表示
未使用的变量'c'[-Werror = unused-variable]
为避免所有这些错误,请像这样声明变量b
和c
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;
}